home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / programer2 / pari2 / pari / other / mp_news < prev    next >
Text File  |  1991-11-08  |  126KB  |  6,181 lines

  1. *********************************************************************
  2. *===================================================================*
  3. **                                   **
  4. *=                                   =*
  5. **                                   **
  6. *=     oooooooooo       ooooo       oooooooooo      ooooo       =*
  7. **    ooooooooooo      ooooooooo    ooooooooooo     ooo        **
  8. **    ooo     ooo     ooo     ooo     ooo     ooo     ooo        **
  9. *=    ooo     ooo     ooo     ooo     ooo     ooo     ooo        =*
  10. **    ooooooooooo     ooooooooooo     oooooooooo    ooo        **
  11. *=    oooooooooo    ooooooooooo     ooooooooooo     ooo        =*
  12. **    ooo         ooo     ooo     ooo     ooo     ooo        **
  13. *=    ooo         ooo     ooo     ooo     ooo     ooo        =*
  14. **     ooooo           ooooo   ooooo   ooooo   ooooo   ooooo       **
  15. **                                   **
  16. *=                                   =*
  17. **            version numero 2               **
  18. **                                   **
  19. *=               commentee                   =*
  20. **                                   **
  21. *=           fichier cree le 22 sept. 1987           =*
  22. **                                   **
  23. *=                par                    =*
  24. **                                   **
  25. *=      christian batut , henri cohen , michel olivier       =*
  26. **                                   **
  27. *=      """"""""""""""""""""""""""""""""""""""""""""""       =*
  28. **                                   **
  29. **                                   **
  30. *===================================================================*
  31. *********************************************************************
  32.  
  33.  
  34. *-------------------------------------------------------------------*
  35. *                                    *
  36. *  Notations :                            *
  37. *        T = type ( S , I , ou R ).                *
  38. *        R = type reel.                    *
  39. *        S = type entier court ( long du C).         *
  40. *        P = p-adique.                    *
  41. *                                    *
  42. *        L = longueur de la mantisse pour un reel ;        *
  43. *            longueur de la mantisse effective pour un entier*
  44. *        l = longueur totale du nombre avec codage.        *
  45. *        le= longueur effective totale de l'entier avec code *
  46. *            on doit avoir : l <= 2^15-1.            *
  47. *                                    *
  48. *        exp = exposant non biaise d'un reel.                *
  49. *        fexp= exposant biaise ( fexp = exp + 2^23 ).    *
  50. *              on doit avoir : -2^23 <= exp < 2^23        *
  51. *        fvalp=valuation p-adique biaisee d'un p-adique.     *
  52. *              ( fvalp = valuation + 2^15 )            *
  53. *                                    *
  54. *-------------------------------------------------------------------*
  55.  
  56.  
  57.  
  58.  
  59. *-------------------------------------------------------------------*
  60. *                                    *
  61. *    Conventions :                            *
  62. *        Tous les sous programmes creent la place necessaire *
  63. *        pour stocker le resultat , a l'exception des        *
  64. *        programmes d'affectation et d'echange , ainsi que    *
  65. *        des programmes dont le nom se termine par la lettre *
  66. *        "z" . On entre dans ces derniers avec une zone creee*
  67. *        dans la pile PARI ou le resultat est range.     *
  68. *                                    *
  69. *        Le nombre reel 0 s'ecrit avec mantisse non          *
  70. *        significative;le deuxieme lgmot code contient    *
  71. *        -32*L + (2^23) ou L est la longueur de la mantisse    *
  72. *                                    *
  73. *        Les registres a0,a1,d0,d1 sont en general utilises    *
  74. *        par les programmes et ne sont pas restaures a leurs *
  75. *        valeurs d'entree.Tous les autres sont sauvegardes.  *
  76. *                                    *
  77. *        Les objets utilises par PARI sont crees dans une    *
  78. *        pile dite dans la suite "pile PARI",pointee par     *
  79. *        _avma.                        *
  80. *                                    *
  81. *-------------------------------------------------------------------*
  82.  
  83.  
  84.  
  85. #define affer1    1
  86. #define affer2  2
  87. #define affer3    3
  88. #define affer4  4
  89. #define affer5    5
  90. #define exger1    6
  91. #define exger2    7
  92. #define shier1    8
  93. #define shier2    9
  94. #define truer1    10
  95. #define truer2    11
  96. #define adder1    12
  97. #define adder2    13
  98. #define adder3    14
  99. #define adder4    15
  100. #define adder5    16
  101. #define muler1    17
  102. #define muler2    18
  103. #define muler3    19
  104. #define muler4    20
  105. #define muler5    21
  106. #define muler6    22
  107. #define diver1    23
  108. #define diver2    24
  109. #define diver3    25
  110. #define diver4    26
  111. #define diver5    27
  112. #define diver6    28
  113. #define diver7    29
  114. #define diver8    30
  115. #define diver9    31
  116. #define diver10 32
  117. #define diver11 33
  118. #define diver12 34
  119. #define divzer1 35
  120. #define dvmer1    36
  121. #define dvmzer1 37
  122. #define moder1    38
  123. #define modzer1 39
  124. #define reser1    40
  125. #define reszer1 41
  126. #define arier1    42
  127. #define arier2    43
  128. #define errpile 44
  129. #define rtodber 45
  130. #define gerper    46 
  131.  
  132.     .text
  133.  
  134.     .globl    _typ
  135.     .globl    _lg
  136.     .globl    _lgef
  137.     .globl    _mant
  138.     .globl    _signe
  139.     .globl    _expo
  140.     .globl    _pere
  141.     .globl    _valp
  142.     .globl    _precp
  143.     .globl    _varn
  144.     .globl    _settyp
  145.     .globl    _setlg
  146.     .globl    _setlgef
  147.     .globl    _setmant
  148.     .globl    _setsigne
  149.     .globl    _setexpo
  150.     .globl    _expi
  151.     .globl    _setpere
  152.     .globl    _incpere
  153.     .globl    _setvalp
  154.     .globl    _setprecp
  155.     .globl    _setvarn
  156.     .globl    _cget
  157.     .globl    _cgetg
  158.     .globl    _cgeti
  159.     .globl    _cgetr
  160.     .globl    _cgiv
  161.     .globl    _gerepile
  162.     .globl    _mpaff
  163.     .globl    _affsz
  164.     .globl    _affsi
  165.     .globl    _affsr
  166.     .globl    _affii
  167.     .globl    _affir
  168.     .globl    _affrs
  169.     .globl    _affri
  170.     .globl    _affrr
  171.     .globl    _stoi
  172.     .globl    _itos
  173.     .globl    _mpneg
  174.     .globl    _mpnegz
  175.     .globl    _negs
  176.     .globl    _negi
  177.     .globl    _negr
  178.     .globl    _mpabs
  179.     .globl    _mpabsz
  180.     .globl    _abss
  181.     .globl    _absi
  182.     .globl    _absr
  183.     .globl    _mptrunc
  184.     .globl    _mptruncz
  185.     .globl    _mpent
  186.     .globl    _mpentz
  187.     .globl    _mpexg
  188.     .globl    _vals
  189.     .globl    _vali
  190.     .globl    _mpshift
  191.     .globl    _mpshiftz
  192.     .globl    _shifts
  193.     .globl    _shifti
  194.     .globl    _shiftr
  195.     .globl    _mpcmp
  196.     .globl    _cmpss
  197.     .globl    _cmpsi
  198.     .globl    _cmpsr
  199.     .globl    _cmpis
  200.     .globl    _cmpii
  201.     .globl    _cmpir
  202.     .globl    _cmprs
  203.     .globl    _cmpri
  204.     .globl    _cmprr
  205.     .globl    _mpadd
  206.     .globl    _addss
  207.     .globl    _addsi
  208.     .globl    _addsr
  209.     .globl    _addii
  210.     .globl    _addir
  211.     .globl    _addrr
  212.     .globl    _mpaddz
  213.     .globl    _addssz
  214.     .globl    _addsiz
  215.     .globl    _addsrz
  216.     .globl    _addiiz
  217.     .globl    _addirz
  218.     .globl    _addrrz
  219.     .globl    _mpsub
  220.     .globl    _subss
  221.     .globl    _subsi
  222.     .globl    _subsr
  223.     .globl    _subis
  224.     .globl    _subii
  225.     .globl    _subir
  226.     .globl    _subrs
  227.     .globl    _subri
  228.     .globl    _subrr
  229.     .globl    _mpsubz
  230.     .globl    _subssz
  231.     .globl    _subsiz
  232.     .globl    _subsrz
  233.     .globl    _subisz
  234.     .globl    _subiiz
  235.     .globl    _subirz
  236.     .globl    _subrsz
  237.     .globl    _subriz
  238.     .globl    _subrrz
  239.     .globl    _mpmul
  240.     .globl    _mulss
  241.     .globl    _mulmodll
  242.     .globl    _mulsi
  243.     .globl    _mulsr
  244.     .globl    _mulii
  245.     .globl    _mulir
  246.     .globl    _mulrr
  247.     .globl    _mpmulz
  248.     .globl    _mulssz
  249.     .globl    _mulsiz
  250.     .globl    _mulsrz
  251.     .globl    _muliiz
  252.     .globl    _mulirz
  253.     .globl    _mulrrz
  254.     .globl    _dvmdss
  255.     .globl    _dvmdsi
  256.     .globl    _dvmdis
  257.     .globl    _dvmdii
  258.     .globl    _mpdvmdz
  259.     .globl    _dvmdssz
  260.     .globl    _dvmdsiz
  261.     .globl    _dvmdisz
  262.     .globl    _dvmdiiz
  263.     .globl    _mpdiv
  264.     .globl    _divss
  265.     .globl    _divsi
  266.     .globl    _divsr
  267.     .globl    _divis
  268.     .globl    _divii
  269.     .globl    _divir
  270.     .globl    _divrs
  271.     .globl    _divri
  272.     .globl    _divrr
  273.     .globl    _mpdivis
  274.     .globl    _divise
  275.     .globl    _mpdivz
  276.     .globl    _divssz
  277.     .globl    _divsiz
  278.     .globl    _divsrz
  279.     .globl    _divisz
  280.     .globl    _diviiz
  281.     .globl    _divirz
  282.     .globl    _divrsz
  283.     .globl    _divriz
  284.     .globl    _divrrz
  285.     .globl    _mpinvz
  286.     .globl    _mpinvsr
  287.     .globl    _mpinvir
  288.     .globl    _mpinvrr
  289.     .globl    _modss
  290.     .globl    _modsi
  291.     .globl    _modis
  292.     .globl    _modii
  293.     .globl    _mpmodz
  294.     .globl    _modssz
  295.     .globl    _modsiz
  296.     .globl    _modisz
  297.     .globl    _modiiz
  298.     .globl    _resss
  299.     .globl    _ressi
  300.     .globl    _resis
  301.     .globl    _resii
  302.     .globl    _mpresz
  303.     .globl    _resssz
  304.     .globl    _ressiz
  305.     .globl    _resisz
  306.     .globl    _resiiz
  307.     .globl    _convi
  308.     .globl    _confrac
  309.     .globl    _addsii
  310.     .globl    _mulsii
  311.     .globl    _divisii
  312.  
  313.  
  314. *********************************************************************
  315. *********************************************************************
  316. ***                                   ***
  317. ***         PROGRAMMES DE GESTION DE LA MEMOIRE PARI      ***
  318. ***                                   ***
  319. *********************************************************************
  320. *********************************************************************
  321.  
  322.  
  323.  
  324. *===================================================================*
  325. *                                    *
  326. *        Allocation memoire dans pile PARI en C            *
  327. *                                    *
  328. *    entree : a7@(4) contient la longueur totale a attribuer     *
  329. *    sortie : d0 pointe sur un type I ou R            *
  330. *         d1 et a1 sont inutilises                *
  331. *                                    *
  332. *===================================================================*
  333.  
  334. _cget:     move.l    4(sp),d0
  335.     bsr.b     _get
  336.     move.l    a0,d0
  337.     rts
  338.  
  339. _cgetg: move.l    8(sp),d0
  340.     ror.l    #8,d0
  341.     move.w    6(sp),d0
  342.     bsr.b     _get
  343.     move.l    a0,d0
  344.     rts
  345.  
  346. _cgeti:  move.l    4(sp),d0
  347.     bsr.b     _geti
  348.     move.l    a0,d0
  349.     rts
  350.  
  351. _cgetr:  move.l    4(sp),d0
  352.     bsr.b     _getr
  353.     move.l    a0,d0
  354.     rts
  355.  
  356. *===================================================================*
  357. *                                    *
  358. *        Allocation memoire dans pile PARI            *
  359. *                                    *
  360. *    entree : d0.w contient le nombre total de longs mots    *
  361. *         demandes si type I ou R                *
  362. *    sortie : a0 pointe sur la zone allouee ; _avma est mis    *
  363. *         a jour ; message d'erreur si memoire insuffisante ;*
  364. *         d0 est inchange;d1 et a1 sont sauvegardes.     *
  365. *    remarque : il est interdit de creer des type S dans la pile *
  366. *                                    *
  367. *===================================================================*
  368.  
  369. _get:     move.l    d1,-(sp) 
  370.     moveq    #0,d1
  371.     move.w    d0,d1
  372.     lsl.l    #2,d1
  373.     move.l    _avma,a0
  374.     sub.l    d1,a0
  375.     cmp.l    _bot,a0
  376.     bmi.b     mnet
  377.     move.l    a0,_avma
  378.     swap    d0
  379.     move.b    #1,d0
  380.     swap    d0
  381.     move.l    d0,(a0)
  382.     move.l    (sp)+,d1
  383.     rts
  384.  
  385. _geti:     move.l    d1,-(sp)
  386.     moveq    #0,d1
  387.     move.w    d0,d1
  388.     lsl.l    #2,d1
  389.     move.l    _avma,a0
  390.     sub.l    d1,a0
  391.     cmp.l    _bot,a0
  392.     bmi.b     mnet
  393.     move.l    a0,_avma
  394.     move.w    #0x101,(a0)
  395.     move.w    d0,2(a0)
  396.     move.l    (sp)+,d1
  397.     rts
  398.  
  399. _getr:     move.l    d1,-(sp)
  400.     moveq    #0,d1
  401.     move.w    d0,d1
  402.     lsl.l    #2,d1
  403.     move.l    _avma,a0
  404.     sub.l    d1,a0
  405.     cmp.l    _bot,a0
  406.     bmi.b     mnet
  407.     move.l    a0,_avma
  408.     move.w    #0x201,(a0)
  409.     move.w    d0,2(a0)
  410.     move.l    (sp)+,d1
  411.     rts
  412.  
  413. mnet:     move.l    #44,-(sp)
  414.     jsr     _err
  415.  
  416. *===================================================================*
  417. *                                    *
  418. *        Desallocation memoire PARI en C             *
  419. *                                    *
  420. *    entree : a7@(4) pointe sur un type I ou R            *
  421. *    sortie : la zone occupee est desallouee             *
  422. *                                    *
  423. *===================================================================*
  424.  
  425. _cgiv:     move.l    4(sp),a0
  426.  
  427. *===================================================================*
  428. *                                    *
  429. *        Desallocation memoire PARI                *
  430. *                                    *
  431. *    entree : a0@ contient le premier long mot code d'une        *
  432. *         zone memoire a desallouer : uniquement de type     *
  433. *         I ou R                         *
  434. *    sortie : __avma est mis a jour si necessaire ; ou bien le    *
  435. *         nombre de peres de la zone est decremente.     *
  436. *         a0 pointe sur _avma a jour                *
  437. *         tous les autres registres sont inchanges        *
  438. *                                    *
  439. *===================================================================*
  440.  
  441. _giv:     move.l    d0,-(sp)
  442.     cmp.b    #0xff,1(a0)
  443.     beq.b     givf
  444.     cmp.l    _avma,a0
  445.     beq.b     giv1
  446.     sub.b    #1,1(a0)
  447. givf:     move.l    (sp)+,d0
  448.     rts
  449. giv1:     sub.b    #1,1(a0)
  450.     bne.b     givf
  451. 1:      move.w    2(a0),d0
  452.     lea     (0,a0,d0.w*4),a0  
  453.     move.l    a0,_avma
  454.     tst.b    1(a0)
  455.     beq.b     1b
  456.     bra.b     givf    
  457.  
  458. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  459. *                                  *
  460. *            GESTION DE PILE               *
  461. *                                  *
  462. *    Entree : sp(4) et sp(8) contiennent 2 adresses l > p      *
  463. *         sp(12) contient 0 ou une adresse q ;<          *
  464. *                                  *
  465. *    Sortie : la zone entre p et l est ecrasee ;           *
  466. *    -     la zone entre _avma et p est decalee d'autant ;   *
  467. *    -     tous les pointeurs situes dans cette derniere      *
  468. *         zone et qui pointent avant p sont mis a jour      *
  469. *         et q est augmente du decalage .          *
  470. *         ( d0 contient celui ci ou le decalage en octets )*
  471. *    -     de plus si q est non nul la racine pointee par l *
  472. *         est mise a jour si il y a lieu .          *
  473. *    -     _avma est mis a jour ( augmente du decalage )      *
  474. *                                  *
  475. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  476.  
  477. _gerepile:  movem.l d2-d6/a2-a3,-(sp)
  478.         move.l    _avma,d5
  479.         move.l    32(sp),d2        
  480.         move.l    d2,a0
  481.         move.l    d2,d4
  482.         move.l    36(sp),d1        
  483.         move.l    d1,a1
  484.         move.l    d1,d0
  485.         sub.l    d0,d2            
  486.         bhi.b     L1000             
  487.         move.l    40(sp),d0
  488.         bra.w     9f
  489. L1000:  sub.l    d5,d1
  490.         lsr.l    #2,d1             
  491.         bra.b     2f
  492. 1:      move.l    -(a1),-(a0)
  493. 2:      dbra    d1,1b
  494.         sub.l    #0x10000,d1
  495.         bge.b     1b
  496.         move.l    a0,_avma          
  497.         clr.l    d3
  498.         lea     _lontyp,a3        
  499. *---------------------------------| mise a jour de la zone recopiee :
  500.  
  501. 3:      move.b    (a0),d3            
  502.         move.l    (a3,d3.w*4),d1 
  503.         lea       (a0,d1.l*4),a1 
  504.         move.w    2(a0),d1         
  505.     move.l     a0,a2
  506.         lea       (a0,d1.w*4),a0 
  507.     cmp.b    #10,d3
  508.     bne.b    L1301
  509.     move.w    6(a2),d6
  510.     cmp.w    d1,d6
  511.     bhi.b    6f     
  512.     lea    (a2,d6.w*4),a2 
  513.     bra.b    4f
  514. L1301:    move.l    a0,a2
  515.     subq.l    #4,a1
  516. 8:      addq.l   #4,a1             
  517. 4:      cmp.l    a2,a1             
  518.         bcc.b     6f
  519.         cmp.l    (a1),d0            
  520.         bls.b     5f                
  521.         cmp.l    (a1),d5            
  522.         bhi.b     8b                
  523.         add.l    d2,(a1)+           
  524.         bra.b     4b
  525. 5:      cmp.l    (a1)+,d4           
  526.         bls.b     4b                
  527.         cmp.l    d4,a0
  528.         bhi.b     4b
  529.         move.l    #46,-(sp)      
  530.         jsr     _err
  531. 6:      cmp.l    d4,a0             
  532.         bcs.b     3b
  533.         bne.b     7f
  534.         tst.l    40(sp)           
  535.         bne.b     3b               
  536. 7:      move.l    d0,d1
  537.     move.l    40(sp),d0
  538.         beq.b     L1101
  539.         cmp.l    d0,d1             
  540.         bls.b     9f                
  541.         cmp.l    d0,d5
  542.         bhi.b     9f
  543. L1101:     add.l    d2,d0             
  544. 9:      movem.l  (sp)+,d2-d6/a2-a3
  545.     rts
  546.  
  547. *********************************************************************
  548. *********************************************************************
  549. ***                                   ***
  550. ***     TYPE , MANTISSE , LONGUEUR , EXPOSANT , SIGNE .       ***
  551. ***                                   ***
  552. ***     VALUATION , PRECISION DES P-ADIQUES , VARIABLES.      ***
  553. ***                                   ***
  554. *********************************************************************
  555. *********************************************************************
  556.  
  557. _typ:     moveq    #0,d0
  558.     move.b    ([4,sp]),d0
  559.     rts
  560.  
  561. _settyp: move.b    11(sp),([4,sp])
  562.     rts
  563.  
  564. _varn:     moveq    #0,d0
  565.     move.b    ([4,sp],5),d0
  566.     rts
  567.  
  568. _setvarn:  move.b    11(sp),([4,sp],5)
  569.     rts
  570.  
  571. _mant:   move.l    4(sp),a0
  572.         tst.b    4(a0)
  573.         bne.b     1f
  574.         moveq   #0,d0
  575.         rts
  576. 1:      move.w    10(sp),d0      
  577.         move.l    (4,a0,d0.w*4),d0 
  578.         rts
  579.  
  580. _setmant: move.l    4(sp),a0
  581.     move.w    10(sp),d0
  582.     lea     (4,a0,d0.w*4),a0 
  583.     move.l    12(sp),(a0) 
  584.     rts
  585.  
  586. _lg:     moveq    #0,d0
  587.     move.w    ([4,sp],2),d0
  588.     rts
  589.  
  590. _setlg:  move.w    10(sp),([4,sp],2)
  591.     rts
  592.  
  593. _lgef:     moveq    #0,d0
  594.     move.w    ([4,sp],6),d0
  595.     rts
  596.  
  597. _setlgef: move.w    10(sp),([4,sp],6)
  598.     rts
  599.  
  600. _signe:  move.b    ([4,sp],4),d0
  601.     move.b    ([4,sp]),d1
  602.     cmp.b    #3,d1
  603.     bcs.b     1f
  604.     cmp.b    #4,d1
  605.     beq.b     2f
  606.     cmp.b    #5,d1
  607.     bne.b     1f
  608. 2:      move.l    ([4,sp],4),a0
  609.     move.b    4(a0),d0
  610. 1:      extb.l    d0
  611.     rts
  612.  
  613. _setsigne: move.b    11(sp),([4,sp],4)
  614.     rts
  615.             
  616. _pere:     moveq    #0,d0
  617.     move.b    ([4,sp],1),d0
  618.     rts
  619.  
  620. _setpere: move.b    11(sp),([4,sp],1)
  621.     rts
  622.  
  623. _incpere: addq.b    #1,([4,sp],1)
  624.     bne.b     1f
  625.     move.b    #255,([4,sp],1)
  626. 1:      rts
  627.  
  628. _expo:     move.l    ([4,sp],4),d0
  629.     and.l    #0xffffff,d0
  630.     sub.l    #0x800000,d0
  631.     rts
  632.  
  633. _expi:     move.l    4(sp),a0
  634.     moveq    #0,d0
  635.     move.w    6(a0),d0
  636.     subq.l    #2,d0
  637.     lsl.l    #5,d0
  638.     move.l    8(a0),d1
  639.     bfffo    d1{0:32},d1
  640.     addq.l    #1,d1
  641.     sub.l    d1,d0
  642.     rts
  643.  
  644. _setexpo: move.l    8(sp),d0
  645.     add.l    #0x800000,d0
  646.     move.l    4(sp),a0
  647.     move.b    4(a0),d1
  648.     move.l    d0,4(a0)
  649.     move.b    d1,4(a0)
  650.     rts
  651.  
  652. _valp:     moveq    #0,d0
  653.     move.w    ([4,sp],6),d0
  654.     sub.l    #0x8000,d0
  655.     rts
  656.  
  657. _setvalp:  move.l    8(sp),d0
  658.     add.l    #0x8000,d0
  659.     move.w    d0,([4,sp],6)
  660.     rts
  661.  
  662. _precp:  moveq    #0,d0
  663.     move.w    ([4,sp],4),d0
  664.     rts
  665.  
  666. _setprecp: move.l    8(sp),d0
  667.     move.l    4(sp),a0
  668.     move.w    d0,4(a0)
  669.     rts
  670.  
  671. *********************************************************************
  672. *********************************************************************
  673. ***                                   ***
  674. ***         PROGRAMMES D'AFFECTATION OU D'ECHANGE          ***
  675. ***                                   ***
  676. *********************************************************************
  677. *********************************************************************
  678.  
  679. *===================================================================*
  680. *                                    *
  681. *    Affectation generale    n2 --> n1                *
  682. *                                    *
  683. *    entree : a7(4) pointe sur n2 de type I ou R        *
  684. *         a7(8) pointe sur n1 de type I ou R        *
  685. *    sortie : la zone pointee par a7(8) contient n2         *
  686. *    interdit : n2 ou n1 de type S                *
  687. *    remarques: erreur dans le cas R --> I            *
  688. *           d0,d1,a0,a1 sont inchanges            *
  689. *                                    *
  690. *===================================================================*
  691.  
  692. _mpaff:  cmp.b    #1,([8,sp])
  693.     bne.b     1f
  694.     cmp.b    #1,([4,sp])
  695.     beq.b     _affii    
  696.     bra.w     _affri    
  697. 1:      cmp.b    #1,([4,sp])
  698.     beq.w     _affir    
  699.     bra.w     _affrr    
  700.  
  701. *-------------------------------------------------------------------*
  702.             
  703. _affsz:  cmp.b    #2,([4,sp])
  704.     beq.w     _affsr
  705. _affsi:  link    a6,#0
  706.     movem.l    d0/a0,-(sp)
  707.     move.l    8(a6),d0
  708.     move.l    12(a6),a0
  709.     cmp.w    #2,2(a0)
  710.     bne.b     1f
  711.     tst.l    d0
  712.     beq.b     4f
  713.     move.l    #1,-(sp)
  714.     jsr     _err
  715. 1:      tst.l    d0
  716. 4:      bmi.b     2f
  717.     bne.b     3f
  718.     move.l    #2,4(a0)
  719.     bra.b     affsif
  720. 3:      move.l    #0x1000003,4(a0)
  721.     move.l    d0,8(a0)
  722.     bra.b     affsif
  723. 2:      move.l    #0xff000003,4(a0)
  724.     neg.l    d0
  725.     move.l    d0,8(a0)
  726. affsif:  movem.l    (sp)+,d0/a0
  727.     unlk    a6
  728.     rts
  729.  
  730. *-------------------------------------------------------------------*
  731.  
  732. _affii:  link    a6,#0
  733.     movem.l    d0/a0-a1,-(sp)
  734.     move.l    8(a6),a1
  735.     move.l    12(a6),a0
  736.     cmp.l    a0,a1
  737.     beq.b     affiif
  738.     move.w    2(a0),d0
  739.     cmp.w    6(a1),d0
  740.     bcc.b     1f
  741.     move.l    #3,-(sp)
  742.     jsr     _err
  743. 1:      move.w    6(a1),d0
  744.     subq.w    #2,d0    
  745.     addq.l    #4,a0
  746.     addq.l    #4,a1
  747. 2:      move.l    (a1)+,(a0)+
  748.     dbra    d0,2b
  749. affiif:  movem.l    (sp)+,d0/a0-a1
  750.     unlk    a6
  751.     rts
  752.  
  753. *-------------------------------------------------------------------*
  754.  
  755. _itos:     move.l    a1,-(sp)
  756.     move.l    8(sp),a1
  757.     cmp.w    #3,6(a1)
  758.     bls.b     1f
  759.     move.l    #2,-(sp)
  760.     jsr     _err
  761. 1:      beq.b     2f
  762.     moveq    #0,d0
  763.     bra.b     itosf
  764. 2:      move.l    8(a1),d0
  765.     cmp.l    #0x80000000,d0
  766.     bcs.b     3f
  767.     beq.b     4f
  768. 5:      move.l    #2,-(sp)
  769.     jsr     _err
  770. 4:      tst.b    4(a1)
  771.     bpl.b     5b
  772.     bra.b     itosf    
  773. 3:      tst.w    4(a1)
  774.     bpl.b     itosf
  775.     neg.l    d0
  776. itosf:     move.l    (sp)+,a1
  777.     rts
  778.  
  779. *-------------------------------------------------------------------*
  780.  
  781.  
  782. _stoi:     move.l    4(sp),d1
  783.     bne.b     1f
  784.     move.l    _gzero,d0
  785.     rts
  786. 1:      move.l    #3,d0
  787.     bsr     _geti
  788.     tst.l    d1
  789.     bmi.b     2f
  790.     move.l    #0x1000003,4(a0)
  791.     bra.b     3f
  792. 2:      move.l    #0xff000003,4(a0)
  793.     neg.l    d1
  794. 3:      move.l    d1,8(a0)
  795.      move.l    a0,d0
  796.     rts
  797.  
  798. *-----------------------------------------------------------------------*
  799.  
  800. _affsr:  link    a6,#0
  801.     movem.l    d0-d1/a0,-(sp)
  802.     move.l    12(a6),a0
  803.     move.l    8(a6),d0
  804.     bne.b     1f
  805.     moveq    #0,d0
  806.     move.w    2(a0),d0
  807.     subq.w    #2,d0
  808.     lsl.l    #5,d0
  809.     neg.l    d0
  810.     add.l    #0x800000,d0
  811.     move.l    d0,4(a0)
  812.     clr.l    8(a0)
  813.     bra.b     affsrf
  814. 1:      bpl.b     2f
  815.     neg.l    d0
  816.     move.b    #0xff,4(a0)
  817.     bra.b     3f
  818. 2:      move.b    #1,4(a0)
  819. 3:      bfffo    d0{0:32},d1
  820.     lsl.l    d1,d0    
  821.     neg.w    d1
  822.     add.w    #31,d1
  823.     move.w    d1,6(a0)
  824.     move.b    #0x80,5(a0)
  825.     move.l    d0,8(a0)
  826.     moveq    #0,d0
  827.     move.w    2(a0),d1
  828.     subq.l    #3,d1    
  829.     add.l    #12,a0    
  830.     bra.b     4f
  831. 5:      move.l    d0,(a0)+
  832. 4:      dbra    d1,5b
  833. affsrf:  movem.l    (sp)+,d0-d1/a0
  834.     unlk    a6
  835.     rts
  836.  
  837. *-------------------------------------------------------------------*
  838.  
  839. _affir:  link a6,#0
  840.     movem.l    d0-d6/a0-a1,-(sp)
  841.     move.l    8(a6),a1
  842.     move.l    12(a6),a0
  843.     tst.b    4(a1)
  844.     bne.b     1f
  845.     moveq    #0,d0
  846.     move.w    2(a0),d0
  847.     subq.w    #2,d0
  848.     lsl.l    #5,d0
  849.     neg.l    d0
  850.     add.l    #0x800000,d0
  851.     move.l    d0,4(a0)
  852.     clr.l    8(a0)
  853.     bra.b     _affirf
  854. 1:      move.l    8(a1),d0
  855.     bfffo    d0{0:32},d1
  856.     lsl.l    d1,d0    
  857.     moveq    #0,d2
  858.     move.w    6(a1),d2
  859.     lsl.l    #5,d2
  860.     sub.l    d1,d2
  861.     add.l    #0x7fffbf,d2
  862.     move.l    d2,4(a0)
  863.     move.b    4(a1),4(a0)
  864.     move.w    6(a1),d4
  865.     subq.w    #3,d4    
  866.     move.w    2(a0),d2
  867.     subq.w    #3,d2    
  868.     add.l    #12,a1    
  869.     addq.l    #8,a0    
  870.     moveq    #1,d6    
  871.     lsl.l    d1,d6
  872.     subq.l    #1,d6
  873.     sub.w    d4,d2    
  874.     bpl.b     2f
  875.     add.w    d2,d4    
  876.     bra.b     2f
  877. 3:      move.l    (a1)+,d3
  878.     rol.l    d1,d3
  879.     move.l    d3,d5
  880.     and.l    d6,d3
  881.     add.l    d3,d0
  882.     move.l    d0,(a0)+
  883.     sub.l    d3,d5
  884.     move.l    d5,d0
  885. 2:      dbra    d4,3b
  886.     tst.w    d2
  887.     bmi.b     4f
  888.     moveq    #0,d3
  889.     move.l    d0,(a0)+
  890.     bra.b     5f
  891. 6:      move.l    d3,(a0)+
  892. 5:      dbra    d2,6b
  893.     bra.b     _affirf
  894. 4:      move.l    (a1)+,d3
  895.     rol.l    d1,d3
  896.     and.l    d6,d3
  897.     add.l    d3,d0
  898.     move.l    d0,(a0)+ 
  899. _affirf:  movem.l    (sp)+,d0-d6/a0-a1
  900.     unlk    a6
  901.     rts
  902.  
  903. *-------------------------------------------------------------------*
  904.  
  905. _affrr:  link    a6,#0
  906.     movem.l    d0-d1/a0-a1,-(sp)
  907.     move.l    8(a6),a1
  908.     move.l    12(a6),a0
  909.     cmp.l    a0,a1
  910.     beq.b     affrrf
  911.     tst.b    4(a1)
  912.     bne.b     6f
  913.     move.l    4(a1),4(a0)
  914.     clr.l    8(a0)
  915.     bra.b     affrrf
  916. 6:      addq.l    #4,a0
  917.     addq.l    #4,a1
  918.     move.w    -2(a0),d0
  919.     move.w    -2(a1),d1    
  920.     cmp.w    d0,d1
  921.     bhi.b     1f
  922.     sub.w    d1,d0
  923.     subq.w    #2,d1
  924. 3:      move.l    (a1)+,(a0)+    
  925.     dbra    d1,3b
  926.     moveq    #0,d1
  927.     bra.b     2f
  928. 4:      move.l    d1,(a0)+
  929. 2:      dbra    d0,4b
  930.     bra.b     affrrf
  931. 1:      subq.w    #2,d0
  932. 5:      move.l    (a1)+,(a0)+
  933.     dbra    d0,5b
  934. affrrf:  movem.l    (sp)+,d0-d1/a0-a1
  935.     unlk    a6
  936.     rts
  937.  
  938. *-------------------------------------------------------------------*
  939.  
  940.  
  941. _affrs:  move.l    #4,-(sp)
  942.     jsr     _err
  943.  
  944. *-------------------------------------------------------------------*
  945.  
  946.  
  947. _affri:  move.l    #5,-(sp)
  948.     jsr     _err
  949.  
  950. *===================================================================*
  951. *                                    *
  952. *            Echange de deux nombres             *
  953. *                                    *
  954. *    entree : a7(4) contient l'adresse d'une zone z2 contemant    *
  955. *         n2 de type I ou R ; a7(8) contient l'adresse d'une*
  956. *         zone z1 contenant n1 de type I ou R        *
  957. *    sortie : a7(4) contient l'adresse de z2 contenant n1       *
  958. *         a7(8) contient l'adresse de z1 contenant n2       *
  959. *         d0,d1,a0,a1 sont sauvegardes            *
  960. *    remarque : message d'erreur si impossible ; type S interdit *
  961. *                                    *
  962. *===================================================================*
  963.  
  964. _mpexg:  link    a6,#0
  965.     movem.l    d0-d4/a0-a2,-(sp)
  966.     move.l    8(a6),a2    
  967.     move.l    12(a6),a1    
  968.     move.b    (a2),d2
  969.     move.b    (a1),d1
  970.     cmp.b    d1,d2
  971.     beq.b     1f
  972.     move.l    #7,-(sp)
  973.     jsr     _err
  974. 1:      move.l    (a1),d3
  975.     move.l    (a2),d4
  976.     cmp.w    d3,d4
  977.     bne.b     2f
  978.     subq.w    #3,d3
  979.     addq.l    #4,a1
  980.     addq.l    #4,a2
  981. 6:      move.l    (a2),d4
  982.     move.l    (a1),(a2)+
  983.     move.l    d4,(a1)+
  984.     dbra    d3,6b
  985.     bra.b     exgf
  986. 2:      cmp.b    #1,d1
  987.     bne.b     3f
  988.     cmp.w    d3,d4
  989.     ble.b     4f
  990.     exg     a1,a2
  991.     exg     d3,d4
  992. 4:      cmp.w    6(a1),d4
  993.     bpl.b     5f
  994.     move.l    #6,-(sp)
  995.     jsr     _err
  996. 5:      move.l    d4,d0
  997.     bsr     _geti
  998.     move.l    a0,-(sp)     
  999.     move.l    a2,-(sp)     
  1000.     bsr     _affii
  1001.     addq.l    #8,sp
  1002.     move.l    a2,-(sp)     
  1003.     move.l    a1,-(sp)     
  1004.     bsr     _affii
  1005.     addq.l    #8,sp
  1006.     move.l    a1,-(sp)     
  1007.     move.l    a0,-(sp)     
  1008.     bsr     _affii
  1009.     addq.l    #8,sp
  1010.     bsr     _giv 
  1011.     bra.b     exgf
  1012. 3:      move.l    d4,d0
  1013.     bsr     _getr
  1014.     move.l    a0,-(sp)     
  1015.     move.l    a2,-(sp)     
  1016.     bsr     _affrr
  1017.     addq.l    #8,sp
  1018.     move.l    a2,-(sp)     
  1019.     move.l    a1,-(sp)     
  1020.     bsr     _affrr
  1021.     addq.l    #8,sp
  1022.     move.l    a1,-(sp)     
  1023.     move.l    a0,-(sp)     
  1024.     bsr     _affrr
  1025.     addq.l    #8,sp
  1026.     bsr     _giv 
  1027. exgf:     movem.l    (sp)+,d0-d4/a0-a2
  1028.     unlk    a6
  1029.     rts
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035. *********************************************************************
  1036. *********************************************************************
  1037. ***                                   ***
  1038. ***         PROGRAMMES DE CHANGEMENT DE SIGNE          ***
  1039. ***                                   ***
  1040. *********************************************************************
  1041. *********************************************************************
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047. *===================================================================*
  1048. *                                    *
  1049. *            Negation generale                *
  1050. *                                    *
  1051. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1052. *    sortie : d0 pointe sur n1 de type I ou R            *
  1053. *         contenant n1 = -n2 (zone creee)            *
  1054. *    interdit : type S                        *
  1055. *                                    *
  1056. *===================================================================*
  1057.  
  1058. _mpneg:  cmp.b    #1,([4,sp])
  1059.     beq.b     _negi
  1060.     bra.w     _negr
  1061.  
  1062. *===================================================================*
  1063. *                                    *
  1064. *            Negation (par valeur)            *
  1065. *                                    *
  1066. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1067. *         a7(8) pointe sur n1 de type I ou R        *
  1068. *    sortie : la zone pointee par a7(8) contient -n2        *
  1069. *    interdit : type S                        *
  1070. *                                    *
  1071. *===================================================================*
  1072.  
  1073. _mpnegz: move.l    4(sp),a0
  1074.     cmp.l    8(sp),a0
  1075.     bne.b     1f
  1076.     neg.b    4(a0)
  1077.     rts
  1078. 1:      move.l    4(sp),-(sp)
  1079.     bsr     _mpneg
  1080.     move.l    d0,-(sp)
  1081.     move.l    16(sp),4(sp)
  1082.     bsr     _mpaff
  1083.     move.l    (sp),a0
  1084.     addq.l    #8,sp
  1085.     bra.w     _giv
  1086.  
  1087. *===================================================================*
  1088. *                                    *
  1089. *            Negation                    *
  1090. *                                    *
  1091. *    entree : a7(4) contient un type S ou pointe sur un     *
  1092. *         type I ou R , soit n2                *
  1093. *    sortie : d0 pointe sur un type I ou R ,soit n1=-n2        *
  1094. *         (zone creee)                    *
  1095. *                                    *
  1096. *===================================================================*
  1097.  
  1098.  
  1099. _negs:     move.l    4(sp),d1    
  1100.     bne.b     1f
  1101.     move.l _gzero,d0
  1102.     rts
  1103. 1:      moveq    #3,d0
  1104.     bsr     _geti
  1105.     move.l    a0,d0
  1106.     move.l    #0x1000003,4(a0)
  1107.     neg.l    d1
  1108.     bpl.b     2f
  1109.     move.b    #0xff,4(a0)
  1110.     neg.l    d1
  1111. 2:      move.l    d1,8(a0)
  1112.      rts
  1113.  
  1114. *-------------------------------------------------------------------*
  1115.  
  1116.  
  1117. _negi:     move.l    4(sp),a1    
  1118.     move.w    6(a1),d1
  1119.     move.l    d1,d0
  1120.     bsr     _geti
  1121.     move.l    a0,d0
  1122.     addq.l    #4,a0
  1123.     addq.l    #4,a1
  1124.     subq.w    #2,d1
  1125. 1:      move.l    (a1)+,(a0)+
  1126.     dbra    d1,1b
  1127.     move.l    d0,a0
  1128.     neg.b    4(a0)
  1129.     rts
  1130.  
  1131. *-------------------------------------------------------------------*
  1132.  
  1133.  
  1134. _negr:     move.l    4(sp),a1
  1135.     move.l    (a1),d1
  1136.     move.l    d1,d0
  1137.     bsr     _getr
  1138.     move.l    a0,d0
  1139.     addq.l    #4,a0
  1140.     addq.l    #4,a1
  1141.     subq.w    #2,d1
  1142. 1:      move.l    (a1)+,(a0)+
  1143.     dbra    d1,1b
  1144.     move.l    d0,a0
  1145.     neg.b    4(a0)
  1146.     rts
  1147.  
  1148. *===================================================================*
  1149. *                                    *
  1150. *            Valeur absolue generale             *
  1151. *                                    *
  1152. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1153. *    sortie : d0 pointe sur n1 de type I ou R avec n1=abs(n2)    *
  1154. *         de type I ou R (zone creee)            *
  1155. *    interdit : type S                        *
  1156. *                                    *
  1157. *===================================================================*
  1158.  
  1159. _mpabs:  cmp.b    #1,([4,sp])
  1160.     beq.b     _absi
  1161.     bra.w     _absr
  1162.  
  1163. *===================================================================*
  1164. *                                    *
  1165. *            Valeur absolue (par valeur)         *
  1166. *                                    *
  1167. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1168. *         a7(8) pointe sur n1 de type I ou R        *
  1169. *    sortie : la zone pointee par a7(8) contient abs(n2)    *
  1170. *    interdit : type S                        *
  1171. *                                    *
  1172. *===================================================================*
  1173.  
  1174. _mpabsz: move.l    4(sp),a0
  1175.     cmp.l    8(sp),a0
  1176.     bne.b     1f
  1177.     and.b    #1,4(a0)
  1178.     rts
  1179. 1:      move.l    4(sp),-(sp)
  1180.     bsr     _mpabs
  1181.     move.l    d0,-(sp)
  1182.     move.l    16(sp),4(sp)
  1183.     bsr     _mpaff
  1184.     move.l    (sp),a0
  1185.     addq.l    #8,sp
  1186.     bra.w     _giv
  1187.  
  1188. *===================================================================*
  1189. *                                    *
  1190. *            Valeur absolue                *
  1191. *                                    *
  1192. *    entree : a7(4) contient ou pointe sur n2            *
  1193. *    sortie : d0 pointe sur i1 ou r1 (zone creee)        *
  1194. *                                    *
  1195. *===================================================================*
  1196.  
  1197.  
  1198. _abss:     move.l    4(sp),d1    
  1199.     bne.b     1f
  1200.     move.l    _gzero,d0
  1201.     rts
  1202. 1:      moveq    #3,d0
  1203.     bsr     _geti
  1204.     move.l    a0,d0
  1205.     move.l    #0x1000003,4(a0)
  1206.     tst.l    d1
  1207.     bpl.b     2f
  1208.     neg.l    d1
  1209. 2:      move.l    d1,8(a0)
  1210.     rts
  1211.  
  1212. *-------------------------------------------------------------------*
  1213.  
  1214.  
  1215. _absi:     move.l    4(sp),a1    
  1216.     move.w    6(a1),d1
  1217.     move.w    d1,d0
  1218.     bsr     _geti
  1219.     move.l    a0,d0
  1220.     cmp.w    #2,d1
  1221.     bne.b     1f
  1222.     move.l    #2,4(a0)
  1223.     bra.b     absif
  1224. 1:      move.l    #0x1000000,4(a0)
  1225.     move.w    d1,6(a0)
  1226.     addq.l    #8,a1
  1227.     addq.l    #8,a0
  1228.     subq.w    #3,d1
  1229. 2:      move.l    (a1)+,(a0)+
  1230.     dbra    d1,2b
  1231. absif:     rts
  1232.  
  1233. *-------------------------------------------------------------------*
  1234.  
  1235.  
  1236. _absr:     move.l    4(sp),a1
  1237.     move.w    2(a1),d1
  1238.     move.w    d1,d0
  1239.     bsr     _getr
  1240.     move.l    a0,d0
  1241.     subq.w    #2,d1
  1242.     addq.l    #4,a1
  1243.     addq.l    #4,a0
  1244. 1:      move.l    (a1)+,(a0)+
  1245.     dbra    d1,1b
  1246.     move.l    d0,a0
  1247.     tst.b    4(a0)
  1248.     bpl.b     absrf
  1249.     neg.b    4(a0)
  1250. absrf:     rts
  1251.  
  1252. *********************************************************************
  1253. *********************************************************************
  1254. ***                                   ***
  1255. ***             VALUATION                  ***
  1256. ***                                   ***
  1257. *********************************************************************
  1258. *********************************************************************
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264. *===================================================================*
  1265. *                                    *
  1266. *    Valuation 2-adique d'un entier court ou d'un entier     *
  1267. *                                    *
  1268. *    entree : a7(4) contient s1 de type S ou pointe sur i1 de    *
  1269. *         type I                         *
  1270. *    sortie : d0.l contient k tel que : k>=0 , n1=2^k*n2 ,    *
  1271. *         avec n2 et 2 premiers entre eux ; si n1=0 , alors    *
  1272. *         d0.l contient -1.                    *
  1273. *    remarque : type R interdit                    *
  1274. *                                    *
  1275. *===================================================================*
  1276.  
  1277.  
  1278. _vals:     link    a6,#0
  1279.     move.l    d2,-(sp)
  1280.     moveq    #-1,d0
  1281.     move.l    8(a6),d1    
  1282.     beq.b     valsf
  1283.     moveq    #0,d0
  1284.     tst.w    d1
  1285.     bne.b     1f
  1286.     add.l    #16,d0
  1287.     swap    d1
  1288. 1:      tst.b    d1
  1289.     bne.b     2f
  1290.     addq.l    #8,d0
  1291.     lsr.l    #8,d1
  1292. 2:      move.l    d1,d2
  1293.     and.l    #15,d2
  1294.     bne.b     3f
  1295.     addq.l    #4,d0
  1296.     lsr.l    #4,d1
  1297. 3:      move.l    d1,d2
  1298.     and.l    #3,d2
  1299.     bne.b     4f
  1300.     addq.l    #2,d0
  1301.     lsr.l    #2,d1
  1302. 4:      btst    #0,d1
  1303.     bne.b     valsf
  1304.     addq.l    #1,d0
  1305. valsf:     move.l    (sp),d2
  1306.     unlk    a6
  1307.     rts
  1308.  
  1309.  
  1310. _vali:     link    a6,#0
  1311.     move.l    d2,-(sp)
  1312.     move.l    8(a6),a1    
  1313.     moveq    #-1,d0
  1314.     tst.b    4(a1)
  1315.     beq.b     valif
  1316.     move.w    6(a1),d1    
  1317.     lea     (a1,d1.w*4),a1 
  1318.     move.l    #0xffff,d0
  1319. 5:      tst.l    -(a1)
  1320.     dbne    d0,5b
  1321.     not.w    d0
  1322.     lsl.l    #5,d0
  1323.     move.l    (a1),d1
  1324.     tst.w    d1
  1325.     bne.b     1f
  1326.     add.l    #16,d0
  1327.     swap    d1
  1328. 1:      tst.b    d1
  1329.     bne.b     2f
  1330.     addq.l    #8,d0
  1331.     lsr.l    #8,d1
  1332. 2:      move.l    d1,d2
  1333.     and.l    #15,d2
  1334.     bne.b     3f
  1335.     addq.l    #4,d0
  1336.     lsr.l    #4,d1
  1337. 3:      move.l    d1,d2
  1338.     and.l    #3,d2
  1339.     bne.b     4f
  1340.     addq.l    #2,d0
  1341.     lsr.l    #2,d1
  1342. 4:      btst    #0,d1
  1343.     bne.b     valif
  1344.     addq.l    #1,d0
  1345. valif:     move.l    (sp),d2
  1346.     unlk    a6
  1347.     rts
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353. *********************************************************************
  1354. *********************************************************************
  1355. ***                                   ***
  1356. ***             PROGRAMMES DE SHIFT               ***
  1357. ***                                   ***
  1358. *********************************************************************
  1359. *********************************************************************
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365. *===================================================================*
  1366. *                                    *
  1367. *            Shift general                *
  1368. *                                    *
  1369. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1370. *         a7(8) contient k = nombre de shifts        *
  1371. *    sortie : d0 pointe sur n1 de type I ou R            *
  1372. *         contenant n1 = 2^k * n2 (zone creee)        *
  1373. *    interdit : type S                        *
  1374. *                                    *
  1375. *===================================================================*
  1376.  
  1377. _mpshift: cmp.b    #1,([4,sp])
  1378.     beq.w     _shifti
  1379.     bra.w     _shiftr
  1380.  
  1381. *===================================================================*
  1382. *                                    *
  1383. *            Shift (par valeur)                *
  1384. *                                    *
  1385. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1386. *         a7(8) contient le nombre de shifts (=k)        *
  1387. *         a7(12) pointe sur n1 de type I ou R        *
  1388. *    sortie : la zone pointee par a7(12) contient 2^k * n2    *
  1389. *    interdit : type S                        *
  1390. *                                    *
  1391. *===================================================================*
  1392.  
  1393. _mpshiftz: move.l    4(sp),a0
  1394.     cmp.l    12(sp),a0
  1395.     bne.b     1f
  1396.     cmp.b    #2,(a0)
  1397.     bne.b     1f
  1398.     move.l    4(a0),d0
  1399.     and.l    #0xffffff,d0
  1400.     add.l    8(sp),d0
  1401.     bvs.w     shier
  1402.     cmp.l    #0x1000000,d0
  1403.     bcc.w     shier
  1404.     tst.l    d0
  1405.     bmi.w     shier
  1406.     move.w    d0,6(a0)
  1407.     swap    d0
  1408.     move.b    d0,5(a0)
  1409.     rts
  1410. 1:      move.l    8(sp),-(sp)
  1411.     move.l    8(sp),-(sp)
  1412.     bsr     _mpshift
  1413.     move.l    d0,(sp)
  1414.     move.l    20(sp),4(sp)
  1415.     bsr     _mpaff
  1416.     move.l    (sp),a0
  1417.     addq.l    #8,sp
  1418.     bra.w     _giv
  1419.  
  1420. *===================================================================*
  1421. *                                    *
  1422. *        Shift d'un entier court = entier                    *
  1423. *                                    *
  1424. *    entree : a7(4) contient s2 de type S            *
  1425. *         a7(8) contient k = nombre de shifts        *
  1426. *    sortie : d0 pointe sur i1 de type I             *
  1427. *         avec i1 = 2^k * s2 (zone creee)            *
  1428. *                                    *
  1429. *===================================================================*
  1430.  
  1431. _shifts: link    a6,#-12
  1432.     move.l    12(a6),-(sp)    
  1433.     move.l    8(a6),d0    
  1434.     bne.b     1f
  1435.     move.l    #0x1000002,-12(a6)
  1436.     move.l    #2,-8(a6)    
  1437.     bra.b     3f
  1438. 1:      move.l    #0x1000003,-12(a6)
  1439.     move.l    #0x1000003,-8(a6)
  1440.     tst.l    d0
  1441.     bpl.b     2f
  1442.     neg.l    d0
  1443.     move.b    #0xff,-8(a6)
  1444. 2:      move.l    d0,-4(a6)    
  1445. 3:      pea     -12(a6)    
  1446.     bsr     _shifti
  1447.     unlk    a6
  1448.     rts
  1449.  
  1450. *===================================================================*
  1451. *                                    *
  1452. *            Shift entier = entier            *
  1453. *                                    *
  1454. *    entree : a7(4) pointe sur i2 de type I             *
  1455. *         a7(8) contient k = nombre de shifts        *
  1456. *    sortie : d0 pointe sur i1 de type I             *
  1457. *         avec i1 = 2^k * i2 (zone creee)            *
  1458. *                                    *
  1459. *===================================================================*
  1460.  
  1461. _shifti: link    a6,#0
  1462.     movem.l    d2-d7/a2-a3,-(sp)
  1463.     move.l    8(a6),a2    
  1464.     move.l    12(a6),d7    
  1465.     bne.b     1f
  1466.     move.w    2(a2),d0
  1467.     bsr     _geti
  1468.     move.l    a0,a3    
  1469.     subq.w    #2,d0
  1470.     addq.l    #4,a0
  1471.     addq.l    #4,a2
  1472. L2401:     move.l    (a2)+,(a0)+
  1473.     dbra    d0,L2401
  1474.     bra.w     shiftif
  1475. 1:      tst.b    4(a2)
  1476.     bne.b     2f
  1477. 6:      move.l    _gzero,d0
  1478.     bra.w     shiftig
  1479. 2:      moveq    #0,d0
  1480.     move.w    6(a2),d0    
  1481.     cmp.l    #1,d7
  1482.     bne.b     3f
  1483.     move.l    8(a2),d5
  1484.     btst    #31,d5
  1485.     beq.b     4f
  1486.     addq.w    #1,d0
  1487.     cmp.w    #0x8000,d0
  1488.     bcs.b     4f
  1489. L1801:     move.l    #8,-(sp)
  1490.     jsr     _err
  1491. 4:      bsr     _geti
  1492.     move.l    a0,a3
  1493.     move.w    2(a0),6(a0)    
  1494.     move.b    4(a2),4(a0)    
  1495.     lea     (a0,d0.w*4),a1 
  1496.     lea     (a2,d0.w*4),a2 
  1497.     btst    #31,d5
  1498.     beq.b     5f
  1499.     subq.w    #4,a2
  1500.     move.l    #1,8(a0)
  1501.     subq.w    #1,d0
  1502. 5:      subq.w    #3,d0
  1503. 7:      move.l    -(a2),d1
  1504.     roxl.l    #1,d1
  1505.     move.l    d1,-(a1)
  1506.     dbra    d0,7b
  1507.     bra.w     shiftif
  1508. 3:      cmp.l    #-1,d7
  1509.     bne.b     8f
  1510.     cmp.l    #1,8(a2)
  1511.     bhi.b     9f
  1512.     subq.w    #1,d0
  1513.     cmp.w    #2,d0
  1514.     beq.w     6b
  1515. 9:      bsr     _geti
  1516.     move.l    a0,a3
  1517.     move.b    4(a2),4(a0)    
  1518.     move.w    2(a0),6(a0)    
  1519.     addq.l    #8,a0
  1520.     addq.l    #8,a2
  1521.     move.w    -2(a2),d0
  1522.     subq.w    #3,d0
  1523.     move.l    (a2)+,d1
  1524.     lsr.l    #1,d1
  1525.     beq.b     L1001
  1526.     move.l    d1,(a0)+
  1527.     bra.b     L1001
  1528. L1102:     move.l    (a2)+,d1
  1529.     roxr.l    #1,d1
  1530.     move.l    d1,(a0)+
  1531. L1001:     dbra    d0,L1102
  1532.     bra.w     shiftif
  1533. 8:      tst.l    d7
  1534.     bpl.b     L1201
  1535.     neg.l    d7        
  1536.     move.l    d7,d4
  1537.     lsr.l    #5,d4        
  1538.     and.l    #31,d7        
  1539.     sub.w    d4,d0        
  1540.     cmp.w    #2,d0
  1541.     bls.w     2b    
  1542.     move.l    8(a2),d4
  1543.     lsr.l    d7,d4
  1544.     bne.b     L1302
  1545.     subq.w    #1,d0
  1546.     cmp.w    #2,d0
  1547.     beq.w     6b    
  1548. L1302:     bsr     _geti        
  1549.     move.l    a0,a3
  1550.     move.b    4(a2),4(a0)    
  1551.     move.w    2(a0),6(a0)    
  1552.     lea     (a2,d0.w*4),a2 
  1553.     lea     (a0,d0.w*4),a1 
  1554.     tst.l    d4
  1555.     beq.b     L1401
  1556.     move.l    d4,8(a0)
  1557.     subq.w    #3,d0        
  1558.     bra.b     L1501
  1559. L1401:     addq.l    #4,a2
  1560.     subq.w    #2,d0
  1561. L1501:     moveq    #-1,d6
  1562.     lsr.l    d7,d6        
  1563.     move.l    -(a2),d4
  1564.     lsr.l    d7,d4
  1565.     bra.b     L1601
  1566. L1701:     move.l    -(a2),d2     
  1567.     ror.l    d7,d2
  1568.     move.l    d2,d3
  1569.     and.l    d6,d3
  1570.     sub.l    d3,d2
  1571.     add.l    d2,d4
  1572.     move.l    d4,-(a1)
  1573.     move.l    d3,d4
  1574. L1601:     dbra    d0,L1701
  1575.     bra.b     shiftif
  1576. L1201:     move.l    d7,d4
  1577.     and.l    #31,d7        
  1578.     lsr.l    #5,d4        
  1579.     add.l    d4,d0        
  1580.     cmp.w    #0x7fff,d0
  1581.     bcc.w     L1801
  1582.     moveq    #-1,d6
  1583.     lsl.l    d7,d6
  1584.     not.l    d6        
  1585.     move.l    8(a2),d2
  1586.     rol.l    d7,d2
  1587.     move.l    d2,d3
  1588.     and.l    d6,d3
  1589.     beq.b     L1901
  1590.     addq.w    #1,d0        
  1591. L1901:     bsr     _geti
  1592.     move.l    a0,a3
  1593.     move.l    2(a0),6(a0)    
  1594.     move.b    4(a2),4(a0)    
  1595.     addq.l    #8,a0
  1596.     tst.l    d3
  1597.     beq.b     L2001
  1598.     move.l    d3,(a0)+
  1599. L2001:     sub.l    d3,d2
  1600.     move.l    d2,d5
  1601.     move.w    6(a2),d0
  1602.     add.l    #12,a2
  1603.     subq.w    #3,d0        
  1604.     bra.b     L2101
  1605. L2201:     move.l    (a2)+,d2
  1606.     rol.l    d7,d2
  1607.     move.l    d2,d3
  1608.     and.l    d6,d3
  1609.     sub.l    d3,d2
  1610.     add.l    d3,d5
  1611.     move.l    d5,(a0)+
  1612.     move.l    d2,d5
  1613. L2101:     dbra    d0,L2201
  1614.     move.l    d5,(a0)+
  1615.     moveq    #0,d0
  1616.     bra.b     L2301
  1617. L2501:     move.l    d0,(a0)+
  1618. L2301:     dbra    d4,L2501
  1619. shiftif: move.l    a3,d0        
  1620. shiftig: movem.l (sp)+,d2-d7/a2-a3
  1621.     unlk    a6
  1622.     rts
  1623.  
  1624. *===================================================================*
  1625. *                                    *
  1626. *            Shift reel = reel                *
  1627. *                                    *
  1628. *    entree : a7(4) pointe sur r2 de type R             *
  1629. *         a7(8) contient k = nombre de shifts        *
  1630. *    sortie : d0 pointe sur r1 de type R             *
  1631. *         avec r1 = 2^k * r2 zone creee)             *
  1632. *                                    *
  1633. *===================================================================*
  1634.  
  1635. _shiftr: link    a6,#0
  1636.     movem.l    d2/a2-a3,-(sp)
  1637.     move.l    8(a6),a2    
  1638.     move.l    12(a6),d2    
  1639.     bne.b     1f
  1640.     move.w    2(a2),d0
  1641.     bsr     _getr
  1642.     move.l    a0,a3
  1643.     subq.w    #2,d0
  1644.     addq.l    #4,a0
  1645.     addq.l    #4,a2
  1646. 4:      move.l    (a2)+,(a0)+
  1647.     dbra    d0,4b
  1648.     bra.b     shiftrf
  1649. 1:      move.l    4(a2),d1
  1650.     and.l    #0xffffff,d1
  1651.     add.l    d2,d1        
  1652.     bvc.b     sh
  1653.     shier:     move.l    #9,-(sp)
  1654.     jsr     _err
  1655. sh:      cmp.l    #0x1000000,d1
  1656.     bcc.b     shier        
  1657.     tst.l    d1
  1658.     bmi.b     shier        
  1659.     move.w    2(a2),d0
  1660.     bsr     _getr        
  1661.     move.l    a0,a3
  1662.     move.l    d1,4(a0)    
  1663.     move.b    4(a2),4(a0)    
  1664.     addq.l    #8,a0
  1665.     addq.l    #8,a2
  1666.     subq.w    #3,d0
  1667. 5:      move.l    (a2)+,(a0)+
  1668.     dbra    d0,5b
  1669. shiftrf: move.l    a3,d0        
  1670.     movem.l    (sp)+,d2/a2-a3
  1671.     unlk    a6
  1672.     rts
  1673.  
  1674. *********************************************************************
  1675. *********************************************************************
  1676. ***                                   ***
  1677. ***             PROGRAMMES DE PARTIE ENTIERE          ***
  1678. ***                                   ***
  1679. *********************************************************************
  1680. *********************************************************************
  1681.  
  1682. *===================================================================*
  1683. *                                    *
  1684. *        Fausse partie entiere (trunc)            *
  1685. *                                    *
  1686. *    entree : a7(4) pointe sur n1 de type I ou de type R    *
  1687. *    sortie : d0 pointe sur i1 de type I (zone creee)        *
  1688. *    calcul : si r1 >= 0 , i1 est la partie entiere        *
  1689. *         si r1 < 0 , i1 = - Ent (-r1)            *
  1690. *    remarque : type S interdit                    *
  1691. *                                    *
  1692. *===================================================================*
  1693.  
  1694. _mptrunc: link    a6,#0
  1695.     movem.l    d2-d6/a2-a4,-(sp)
  1696.     move.l    8(a6),a1    
  1697.     cmp.b    #1,(a1)
  1698.     bne.b     5f
  1699.     move.w    6(a1),d0
  1700.     bsr     _geti
  1701.     move.l    a0,a4
  1702.     subq.w    #2,d0
  1703.     addq.l    #4,a0
  1704.     addq.l    #4,a1
  1705. 7:      move.l    (a1)+,(a0)+
  1706.     dbra    d0,7b
  1707.     bra.w     truncf
  1708. 5:      move.l    4(a1),d3    
  1709.     move.l    d3,d0
  1710.     and.l    #0xffffff,d0    
  1711.     sub.l    #0x800000,d0    
  1712.     bpl.b     1f
  1713.     move.l    _gzero,d0
  1714.     bra.b     truncg
  1715. 1:      move.l    d0,d2        
  1716.     lsr.l    #5,d0        
  1717.     addq.l    #3,d0        
  1718.     cmp.l    #0x7fff,d0
  1719.     bls.b     2f
  1720.     move.l    #10,-(sp)
  1721.     jsr     _err
  1722. 2:      bsr     _geti        
  1723.     move.l    a0,a4
  1724.     move.w    d0,6(a0)    
  1725.     move.b    4(a1),4(a0)    
  1726.     move.l    a0,a3        
  1727.     addq.l    #8,a0
  1728.     addq.l    #8,a1        
  1729.     move.w    -6(a1),d1    
  1730.     sub.w    d0,d1        
  1731.     bpl.b     3f
  1732.     move.l    #11,-(sp)
  1733.     jsr     _err
  1734. 3:      subq.w    #3,d0        
  1735.     addq.b    #1,d2        
  1736.     and.b    #31,d2        
  1737.     bne.b     4f
  1738. 8:      move.l    (a1)+,(a0)+
  1739.     dbra    d0,8b
  1740.     bra.b     truncf
  1741. 4:      moveq    #1,d6
  1742.     lsl.l    d2,d6
  1743.     subq.l    #1,d6        
  1744.     moveq    #0,d5
  1745. 6:      move.l    (a1)+,d3     
  1746.     rol.l    d2,d3
  1747.     move.l    d3,d4
  1748.     and.l    d6,d4
  1749.     sub.l    d4,d3
  1750.     add.l    d5,d4
  1751.     move.l    d4,(a0)+
  1752.     move.l    d3,d5
  1753.     dbra    d0,6b
  1754. truncf:  move.l    a4,d0        
  1755. truncg:    movem.l    (sp)+,d2-d6/a2-a4
  1756.     unlk    a6
  1757.     rts
  1758.  
  1759. *===================================================================*
  1760. *                                    *
  1761. *        Fausse partie entiere (par valeur)            *
  1762. *                                    *
  1763. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1764. *         a7(8) pointe sur n1 de type I ou R        *
  1765. *    sortie : la zone pointee par a7(8) contient trunc(n2)    *
  1766. *    interdit : type S                        *
  1767. *                                    *
  1768. *===================================================================*
  1769.  
  1770. _mptruncz: move.l    4(sp),-(sp)
  1771.     bsr     _mptrunc
  1772.     move.l    12(sp),(sp)
  1773.     move.l    d0,-(sp)
  1774.     bsr     _mpaff
  1775.     move.l    d0,a0
  1776.     addq.l    #8,sp
  1777.     bra.w     _giv
  1778.  
  1779. *===================================================================*
  1780. *                                    *
  1781. *        Partie entiere ( max { n <= x} )            *
  1782. *                                    *
  1783. *    entree : a7(4) pointe sur n1 de type I ou R        *
  1784. *    sortie : d0 pointe sur i1 de type I (zone creee)        *
  1785. *    remarque : type S interdit                    *
  1786. *                                    *
  1787. *===================================================================*
  1788.  
  1789. _mpent:  link    a6,#0
  1790.     movem.l    d2-d6/a2-a4,-(sp)
  1791.     move.l    8(a6),a1    
  1792.     cmp.b    #1,(a1)
  1793.     bne.b     1f
  1794.     move.w    6(a1),d0          
  1795.     bsr     _geti
  1796.     move.l    a0,a4        
  1797.     subq.w    #2,d0
  1798.     addq.l    #4,a0
  1799.     addq.l    #4,a1
  1800. 6:      move.l    (a1)+,(a0)+
  1801.     dbra    d0,6b
  1802.     bra.w     entf
  1803. 1:      tst.b    4(a1)
  1804.     blt.b     2f
  1805.     move.l    8(a6),-(sp)     
  1806.     bsr     _mptrunc
  1807.     move.l    d0,a4        
  1808.     addq.l    #4,sp
  1809.     bra.w     entf
  1810. 2:      move.l    4(a1),d3
  1811.     and.l    #0xffffff,d3
  1812.     sub.l    #0x800000,d3    
  1813.     bpl.b     3f
  1814.     moveq    #3,d0
  1815.     bsr     _geti
  1816.     move.l    a0,a4        
  1817.     move.l    #0xff000003,4(a0)
  1818.     move.l    #1,8(a0)
  1819.     bra.b     entf
  1820. 3:      move.l    _avma,a3    
  1821.     move.l    8(a6),-(sp)     
  1822.     bsr     _mptrunc
  1823.     move.l    d0,a4        
  1824.     addq.l    #4,sp        
  1825.     move.l    d3,d1        
  1826.     lsr.l    #5,d3        
  1827.     and.l    #31,d1        
  1828.     move.l    8(a6),a1
  1829.     lea     (8,a1,d3.l*4),a2 
  1830.     move.l    #0x80000000,d6    
  1831.     lsr.l    d1,d6        
  1832.     subq.l    #1,d6        
  1833.     moveq    #0,d2
  1834.     move.w    2(a1),d2
  1835.     subq.l    #3,d2        
  1836.     sub.l    d3,d2        
  1837.     move.l    (a2)+,d5     
  1838.     and.l    d6,d5
  1839.     beq.b     4f
  1840.     bra.b     5f
  1841. 7:      tst.l    (a2)+
  1842. 4:      dbne    d2,7b
  1843.     bne.b     5f
  1844.     bra.b     entf
  1845. 5:      move.l    a4,-(sp)     
  1846.     move.l    #0xffffffff,-(sp)
  1847.     bsr     _addsi        
  1848.     addq.l    #8,sp        
  1849.     move.l    a4,a1        
  1850.     move.l    a3,a4        
  1851.     move.l    d0,a0        
  1852.     move.w    2(a0),d0    
  1853.     subq.w    #1,d0        
  1854. 8:      move.l    -(a1),-(a4)
  1855.     dbra    d0,8b
  1856.     move.l    a4,_avma    
  1857. entf:     move.l    a4,d0        
  1858.     movem.l    (sp)+,d2-d6/a2-a4
  1859.     unlk    a6
  1860.     rts
  1861.  
  1862. *===================================================================*
  1863. *                                    *
  1864. *            Partie entiere (par valeur)         *
  1865. *                                    *
  1866. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1867. *         a7(8) pointe sur n1 de type I ou R        *
  1868. *    sortie : la zone pointee par a7(8) contient ent(n2)    *
  1869. *    interdit : type S                        *
  1870. *                                    *
  1871. *===================================================================*
  1872.  
  1873. _mpentz: move.l    4(sp),-(sp)
  1874.     bsr     _mpent
  1875.     move.l    12(sp),(sp)
  1876.     move.l    d0,-(sp)
  1877.     bsr     _mpaff
  1878.     move.l    d0,a0
  1879.     addq.l    #8,sp
  1880.     bra.w     _giv
  1881.  
  1882. *********************************************************************
  1883. *********************************************************************
  1884. ***                                   ***
  1885. ***         PROGRAMMES DE COMPARAISON              ***
  1886. ***                                   ***
  1887. *********************************************************************
  1888. *********************************************************************
  1889.  
  1890. *===================================================================*
  1891. *                                    *
  1892. *            Comparaison generale            *
  1893. *                                    *
  1894. *    entree : a7(4) pointe sur n2 de type I ou R        *
  1895. *         a7(8) pointe sur n1 de type I ou R        *
  1896. *    sortie : d0.l contient -1 si n2<n1,0 si n2=n1,1 sinon.    *
  1897. *         d1,a0,a1 sont sauvegardes                *
  1898. *    interdit : type S                        *
  1899. *                                    *
  1900. *===================================================================*
  1901.  
  1902. _mpcmp:  link    a6,#0
  1903.     movem.l    d1-d2/a1-a2,-(sp)
  1904.     move.l    8(a6),a2
  1905.     move.l    12(a6),a1    
  1906.     moveq    #0,d1
  1907.     move.b    (a2),d2        
  1908.     cmp.b    (a1),d2
  1909.     ble.b     1f
  1910.     exg     a1,a2
  1911.     moveq    #1,d1
  1912. 1:      move.l    a1,-(sp)
  1913.     move.l    a2,-(sp)
  1914.     cmp.b    #1,(a1)
  1915.     bne.b     2f
  1916.     bsr     _cmpii
  1917.     bra.b     cmpf
  1918. 2:      cmp.b    #1,(a2)
  1919.     bne.b     3f
  1920.     bsr     _cmpir
  1921.     bra.b     cmpf
  1922. 3:      bsr     _cmprr
  1923. cmpf:     addq.l    #8,sp
  1924.     tst.b    d1
  1925.     beq.b     1f
  1926.     neg.l    d0
  1927. 1:      movem.l    (sp)+,d1-d2/a1-a2
  1928.     unlk    a6
  1929.     rts
  1930.  
  1931. *===================================================================*
  1932. *                                    *
  1933. *    Comparaison : entier court et entier court            *
  1934. *                                    *
  1935. *    entree : a7(4) contient s2 de type S            *
  1936. *         a7(8) contient s1 de type S            *
  1937. *    sortie : d0.l contient    -1 si s2<s1,0 si s2=s1,1 sinon    *
  1938. *         d1,a0,a1 sont sauvegardes                *
  1939. *                                    *
  1940. *===================================================================*
  1941.  
  1942. _cmpss:  link    a6,#0
  1943.     movem.l    d1-d2,-(sp)
  1944.     move.l    8(a6),d2    
  1945.     move.l    12(a6),d1    
  1946.     cmp.l    d1,d2
  1947.     beq.b     1f
  1948.     bpl.b     2f
  1949.     moveq    #-1,d0
  1950.     bra.b     cmpssf
  1951. 2:      moveq    #1,d0
  1952.     bra.b     cmpssf
  1953. 1:      moveq    #0,d0
  1954. cmpssf:  movem.l    (sp)+,d1-d2
  1955.     unlk    a6
  1956.     rts
  1957.  
  1958. *===================================================================*
  1959. *                                    *
  1960. *        Comparaison : entier court et entier        *
  1961. *                                    *
  1962. *    entree : a7(4) contient s2 de type S            *
  1963. *         a7(8) pointe sur i1 de type I             *
  1964. *    sortie : d0.l contient 1 si s2>i1,0 si s2=i1,-1 sinon    *
  1965. *         d1,a0,a1 sont sauvegardes                *
  1966. *                                    *
  1967. *===================================================================*
  1968.  
  1969. _cmpsi:  link    a6,#0
  1970.     movem.l    d1-d4/a1,-(sp)
  1971.     move.l    12(a6),a1    
  1972.     move.b    4(a1),d1    
  1973.     move.b    d1,d4        
  1974.     move.b    #1,d3
  1975.     move.l    8(a6),d2    
  1976.     bgt.b     1f        
  1977.     bne.b     2f        
  1978.     move.b    #0,d3
  1979.     bra.b     1f
  1980. 2:      move.b    #-1,d3        
  1981. 1:      eor.b    d3,d4        
  1982.     bpl.b     3f
  1983.     moveq    #1,d0
  1984.     tst.b    d3
  1985.     bpl.b     4f
  1986.     moveq    #-1,d0
  1987. 4:      bra.b     cmpsif
  1988. 3:      cmp.w    #3,6(a1)
  1989.     ble.b     5f
  1990. 8:      moveq    #-1,d0
  1991.     tst.b    d1
  1992.     bpl.b     6f
  1993.     neg.l    d0
  1994. 6:      bra.b     cmpsif
  1995. 5:      cmp.w    #2,6(a1)
  1996.     beq.b     7f
  1997.     tst.l    d2
  1998.     bpl.b     9f
  1999.     neg.l    d2
  2000. 9:      moveq    #1,d0
  2001.     cmp.l    8(a1),d2
  2002.     bhi.b     L1002
  2003.     bne.b     L1103
  2004.     moveq    #0,d0
  2005.     bra.b     cmpsif
  2006. L1103:     moveq    #-1,d0
  2007. L1002:     tst.b    d1
  2008.     bpl.b     cmpsif
  2009.     neg.l    d0
  2010.     bra.b     cmpsif
  2011. 7:      moveq    #1,d0
  2012.     tst.b    d3
  2013.     bne.b     cmpsif
  2014.     moveq    #0,d0
  2015. cmpsif:  movem.l    (sp)+,d1-d4/a1
  2016.     unlk    a6
  2017.     rts
  2018.  
  2019. *===================================================================*
  2020. *                                    *
  2021. *        Comparaison : entier court et reel            *
  2022. *                                    *
  2023. *    entree : a7(4) contient s2 de type S            *
  2024. *         a7(8) pointe sur r1 de type R             *
  2025. *    sortie : d0.l contient 1 si s2>r1, 0 si s2=r1, -1 sinon     *
  2026. *         d1,a0,a1 sont sauvegardes                *
  2027. *                                    *
  2028. *===================================================================*
  2029.  
  2030. _cmpsr:  link    a6,#0
  2031.     movem.l    d1-d4/a0-a2,-(sp)
  2032.     move.l    12(a6),a1    
  2033.     move.b    4(a1),d1    
  2034.     move.b    d1,d4        
  2035.     move.b    #1,d3
  2036.     move.l    8(a6),d2    
  2037.     bgt.b     1f
  2038.     bne.b     2f
  2039.     move.b    #0,d3
  2040.     bra.b     1f
  2041. 2:      move.b    #-1,d3        
  2042. 1:      eor.b    d3,d4        
  2043.     bpl.b     3f
  2044.     moveq    #1,d0
  2045.     tst.b    d3
  2046.     bpl.b     4f
  2047.     moveq    #-1,d0
  2048. 4:      bra.b     cmpsrf
  2049. 3:      tst.b    d1
  2050.     bne.b     5f
  2051.     moveq    #1,d0
  2052.     tst.b    d3
  2053.     bne.b     6f
  2054.     moveq    #0,d0
  2055. 6:      bra.b     cmpsrf
  2056. 5:      move.w    2(a1),d0
  2057.     bsr     _getr        
  2058.     move.l    a0,a2    
  2059.     move.l    a0,-(sp)     
  2060.     move.l    d2,-(sp)     
  2061.     bsr     _affsr
  2062.     addq.l    #8,sp        
  2063.     move.l    a1,-(sp)     
  2064.     move.l    a0,-(sp)     
  2065.     bsr     _cmprr
  2066.     addq.l    #8,sp
  2067.     move.l    a2,a0
  2068.     bsr     _giv
  2069. cmpsrf:  movem.l    (sp)+,d1-d4/a0-a2
  2070.     unlk    a6
  2071.     rts
  2072.  
  2073. *===================================================================*
  2074. *                                    *
  2075. *        Comparaison : entier et entier court        *
  2076. *                                    *
  2077. *    entree : a7(4) pointe sur i2 de type I             *
  2078. *         a7(8) contient s1                 *
  2079. *    sortie : d0.l contient le signe de i2 - s1            *
  2080. *         aucun autre registre n'est affecte                 *
  2081. *                                    *
  2082. *===================================================================*
  2083.  
  2084. _cmpis:  move.l    4(sp),-(sp)
  2085.     move.l    12(sp),-(sp)
  2086.     bsr     _cmpsi
  2087.     addq.l    #8,sp
  2088.     neg.l    d0
  2089.     rts
  2090.  
  2091. *===================================================================*
  2092. *                                    *
  2093. *        Comparaison : entier et entier            *
  2094. *                                    *
  2095. *    entree : a7(4) pointe sur i2 de type I             *
  2096. *         a7(8) pointe sur i1 de type I             *
  2097. *    sortie : d0.l contient :1 si i2>i1,0 si i2=i1,-1 sinon    *
  2098. *         d1,a0,a1 sont sauvegardes                *
  2099. *                                    *
  2100. *===================================================================*
  2101.  
  2102. _cmpii:  link    a6,#0
  2103.     movem.l    d1-d4/a1-a2,-(sp)
  2104.     move.l    8(a6),a2
  2105.     move.l    12(a6),a1    
  2106.     move.b    4(a1),d1    
  2107.     move.b    d1,d4
  2108.     move.b    4(a2),d2    
  2109.     eor.b    d2,d4
  2110.     bpl.b     1f
  2111.     moveq    #1,d0
  2112.     tst.b    d2
  2113.     bpl.b     cmpiif
  2114.     moveq    #-1,d0
  2115.     bra.b     cmpiif
  2116. 1:      move.w    6(a1),d1
  2117.     move.w    6(a2),d2    
  2118.     cmp.w    d1,d2
  2119.     blt.b     3f
  2120.     beq.b     4f
  2121. 6:      moveq    #1,d0
  2122.     tst.b    4(a1)
  2123.     bpl.b     cmpiif
  2124.     moveq    #-1,d0
  2125.     bra.b     cmpiif
  2126. 3:      moveq    #-1,d0
  2127.     tst.b    4(a2)
  2128.     bpl.b     cmpiif
  2129.     moveq    #1,d0
  2130.     bra.b     cmpiif
  2131. 4:      cmp.w    #2,d1
  2132.     bne.b     7f
  2133.     moveq    #0,d0
  2134.     bra.b     cmpiif
  2135. 7:      move.b    4(a1),d3
  2136.     addq.l    #8,a1
  2137.     addq.l    #8,a2
  2138.     subq.w    #3,d1
  2139. L1104:     cmpm.l    (a1)+,(a2)+
  2140.     dbne    d1,L1104
  2141.     bhi.b     8f
  2142.     beq.b     9f
  2143.     moveq    #-1,d0
  2144.     bra.b     L1003
  2145. 9:      moveq    #0,d0
  2146.     bra.b     cmpiif
  2147. 8:      moveq    #1,d0
  2148. L1003:     tst.b    d3
  2149.     bpl.b     cmpiif
  2150.     neg.l    d0
  2151. cmpiif:  movem.l    (sp)+,d1-d4/a1-a2
  2152.     unlk    a6
  2153.     rts
  2154.  
  2155. *===================================================================*
  2156. *                                    *
  2157. *        Comparaison : entier et reel            *
  2158. *                                    *
  2159. *    entree : a7(4) pointe sur i2 de type R             *
  2160. *         a7(8) pointe sur r1 de type R             *
  2161. *    sortie : d0.l contient :1 si i2>r1,0 si i2=r1,-1 sinon    *
  2162. *         d1,a0,a1 sont sauvegardes                *
  2163. *                                    *
  2164. *===================================================================*
  2165.  
  2166. _cmpir:  link    a6,#0
  2167.     movem.l    d1-d4/a0-a3,-(sp)
  2168.     move.l    8(a6),a2
  2169.     move.l    12(a6),a1    
  2170.     move.b    4(a1),d1
  2171.     move.b    d1,d4
  2172.     move.b    4(a2),d2
  2173.     eor.b    d2,d4
  2174.     bpl.b     1f
  2175.     moveq    #1,d0
  2176.     tst.b    d2
  2177.     bpl.b     2f
  2178.     moveq    #-1,d0
  2179. 2:      bra.b     cmpirf
  2180. 1:      tst.b    d1
  2181.     bne.b     3f
  2182.     moveq    #1,d0
  2183.     tst.b    d2
  2184.     bne.b     4f
  2185.     moveq    #0,d0
  2186. 4:      bra.b     cmpirf
  2187. 3:      move.w    2(a1),d0    
  2188.     bsr     _getr
  2189.     move.l    a0,a3
  2190.     move.l    a0,-(sp)     
  2191.     move.l    a2,-(sp)     
  2192.     bsr     _affir
  2193.     addq.l    #8,sp        
  2194.     move.l    a1,-(sp)     
  2195.     move.l    a0,-(sp)     
  2196.     bsr     _cmprr
  2197.     addq.l    #8,sp        
  2198.     move.l    a3,a0
  2199.     bsr     _giv         
  2200. cmpirf:  movem.l    (sp)+,d1-d4/a0-a3
  2201.     unlk    a6
  2202.     rts
  2203.  
  2204. *===================================================================*
  2205. *                                    *
  2206. *        Comparaison : reel et entier court            *
  2207. *                                    *
  2208. *    entree : a7(4) pointe sur r2 de type R             *
  2209. *         a7(8) contient s1                 *
  2210. *    sortie : d0.l contient le signe de r2 - s1            *
  2211. *         aucun autre registre n'est affecte                 *
  2212. *                                    *
  2213. *===================================================================*
  2214.  
  2215. _cmprs:  move.l    4(sp),-(sp)
  2216.     move.l    12(sp),-(sp)
  2217.     bsr     _cmpsr
  2218.     addq.l    #8,sp
  2219.     neg.l    d0
  2220.     rts
  2221.  
  2222. *===================================================================*
  2223. *                                    *
  2224. *        Comparaison : reel et entier            *
  2225. *                                    *
  2226. *    entree : a7(4) pointe sur r2 de type R             *
  2227. *         a7(8) contient i1                 *
  2228. *    sortie : d0.l contient le signe de r2 - i1            *
  2229. *         aucun autre registre n'est affecte                 *
  2230. *                                    *
  2231. *===================================================================*
  2232.  
  2233. _cmpri:  move.l    4(sp),-(sp)
  2234.     move.l    12(sp),-(sp)
  2235.     bsr     _cmpir
  2236.     addq.l    #8,sp
  2237.     neg.l    d0
  2238.     rts
  2239.  
  2240. *===================================================================*
  2241. *                                    *
  2242. *        Comparaison : reel et reel                *
  2243. *                                    *
  2244. *    entree : a7(4) pointe sur r2 de type R             *
  2245. *         a7(8) pointe sur r1 de type R             *
  2246. *    sortie : d0.l contient :1 si r2>r1,0 si r2=r1,-1 sinon    *
  2247. *         d1,a0,a1 sont sauvegardes                *
  2248. *                                    *
  2249. *===================================================================*
  2250.  
  2251. _cmprr:  link    a6,#0
  2252.     movem.l    d1-d5/a1-a2,-(sp)
  2253.     move.l    8(a6),a2
  2254.     move.l    12(a6),a1    
  2255.     move.b    4(a1),d1
  2256.     move.b    d1,d4
  2257.     move.b    4(a2),d2
  2258.     eor.b    d2,d4
  2259.     bpl.b     1f
  2260.     moveq    #1,d0
  2261.     tst.b    d2
  2262.     bpl.b     2f
  2263.     moveq    #-1,d0
  2264. 2:      bra.b     cmprrf
  2265. 1:      tst.b    d1
  2266.     bne.b     3f
  2267.     moveq    #1,d0
  2268.     tst.b    d2
  2269.     bne.b     4f
  2270.     moveq    #0,d0
  2271. 4:      bra.b     cmprrf
  2272. 3:      tst.b    4(a2)
  2273.     bne.b     5f
  2274.     moveq    #-1,d0
  2275.     bra.b     cmprrf
  2276. 5:      moveq    #1,d0
  2277.     move.w    2(a1),d1
  2278.     move.w    2(a2),d2
  2279.     cmp.w    d1,d2
  2280.     bpl.b     6f
  2281.     exg     d1,d2
  2282.     exg     a1,a2
  2283.     moveq    #-1,d0
  2284. 6:      tst.b    4(a2)
  2285.     bpl.b     7f
  2286.     neg.l    d0
  2287. 7:      move.l    4(a1),d5
  2288.     and.l    #0xffffff,d5
  2289.     move.l    4(a2),d3
  2290.     and.l    #0xffffff,d3
  2291.     cmp.l    d5,d3
  2292.     bpl.b     8f
  2293. L1004:     neg.l    d0
  2294.     bra.b     cmprrf
  2295. 8:      bne.b     cmprrf
  2296.     sub.w    d1,d2
  2297.     subq.w    #3,d1
  2298.     addq.l    #8,a1
  2299.     addq.l    #8,a2
  2300. 9:      cmpm.l    (a1)+,(a2)+
  2301.     dbne    d1,9b
  2302.     bcs.b     L1004
  2303.     beq.b     L1105
  2304.     bra.b     cmprrf
  2305. L1202:     tst.l    (a2)+
  2306. L1105:     dbne    d2,L1202
  2307.     bne.b     cmprrf
  2308.     moveq    #0,d0
  2309. cmprrf:  movem.l    (sp)+,d1-d5/a1-a2
  2310.     unlk    a6
  2311.     rts
  2312.  
  2313. *********************************************************************
  2314. *********************************************************************
  2315. ***                                   ***
  2316. ***             PROGRAMMES D'ADDITION                     ***
  2317. ***                                   ***
  2318. *********************************************************************
  2319. *********************************************************************
  2320.  
  2321. *===================================================================*
  2322. *                                    *
  2323. *            Addition generale                *
  2324. *                                    *
  2325. *    entree : a7(4) pointe sur n2 de type I ou R        *
  2326. *         a7(8) pointe sur n1 de type I ou R        *
  2327. *    sortie : d0 pointe sur n2 + n1 de type I ou R (zone creee)    *
  2328. *    interdit : type S                        *
  2329. *    precision : voir les formules des routines specalisees    *
  2330. *                                    *
  2331. *===================================================================*
  2332.  
  2333. _mpadd:  move.l    4(sp),a0
  2334.     move.l    8(sp),a1    
  2335.     move.b    (a0),d0
  2336.     move.b    (a1),d1        
  2337.     cmp.b    d1,d0
  2338.     ble.b     1f
  2339.     exg     a1,a0
  2340.     exg     d1,d0
  2341.     move.l    a0,4(sp)
  2342.     move.l    a1,8(sp)
  2343. 1:      cmp.b    #1,d1
  2344.     beq.w     _addii        
  2345. 2:      cmp.b    #2,d0
  2346.     beq.w     _addrr        
  2347.     bra.w     _addir
  2348.  
  2349. *===================================================================*
  2350. *                                    *
  2351. *            Addition (par valeur)            *
  2352. *                                    *
  2353. *    entree : a7(4) pointe sur n2 de type I ou R        *
  2354. *         a7(8) pointe sur n1 de type I ou R        *
  2355. *         a7(12) pointe sur n3 de type I ou R        *
  2356. *    sortie : la zone pointee par a7(12) contient n2+n1     *
  2357. *    interdit : type S                        *
  2358. *                                    *
  2359. *===================================================================*
  2360.  
  2361. _mpaddz: lea     _mpadd,a0
  2362.     bra.w     mpopz
  2363.  
  2364.     
  2365. _addssz: lea     _addss,a0
  2366.     bra.w     mpopz
  2367.  
  2368.     
  2369. _addsiz: lea     _addsi,a0
  2370.     bra.w     mpopz
  2371.  
  2372.     
  2373. _addsrz: lea     _addsr,a0
  2374.     bra.w     mpopz
  2375.  
  2376.     
  2377. _addiiz: lea     _addii,a0
  2378.     bra.w     mpopz
  2379.  
  2380.     
  2381. _addirz: lea     _addir,a0
  2382.     bra.w     mpopz
  2383.  
  2384.     
  2385. _addrrz: lea     _addrr,a0
  2386.     bra.w     mpopz
  2387.  
  2388. *===================================================================*
  2389. *                                    *
  2390. *     Addition : entier court + entier court = entier        *
  2391. *                                    *
  2392. *    entree : a7(4) contient s2 de type S            *
  2393. *         a7(8) contient s1 de type S            *
  2394. *    sortie : d0 pointe sur s1+s2 de type I(zone cree)        *
  2395. *    remarque : s1 + s2 = s0 est interdit            *
  2396. *                                    *
  2397. *===================================================================*
  2398.  
  2399. _addss:  link    a6,#-2
  2400.     move.l    d2,-(sp)
  2401.     move.l    8(a6),d1
  2402.     move.l    12(a6),d2
  2403.     add.l    d2,d1        
  2404.     bne.b     1f
  2405.     bvs.b     2f
  2406.     move.l    _gzero,d0
  2407.     bra.b     addssg
  2408. 2:      move.w    #4,d0
  2409.     bsr     _geti
  2410.     move.l    #0xff000004,4(a0)
  2411.     move.l    #1,8(a0)
  2412.     clr.l    12(a0)
  2413.     bra.b     addssf
  2414. 1:      move.w    #3,d0
  2415.     bsr     _geti
  2416.     move.l    #0x1000003,4(a0)
  2417.     add.l    8(a6),d2    
  2418.     bvs.b     3f
  2419.     bmi.b     4f        
  2420.     bra.b     5f
  2421. 3:      bcc.b     5f        
  2422. 4:      neg.l    d1
  2423.     move.b    #0xff,4(a0)
  2424. 5:      move.l    d1,8(a0)
  2425. addssf:  move.l    a0,d0        
  2426. addssg:    move.l    (sp),d2
  2427.     unlk    a6
  2428.     rts
  2429.  
  2430. *===================================================================*
  2431. *                                    *
  2432. *        Addition : entier court + entier = entier        *
  2433. *                                    *
  2434. *    entree : a7(4) contient s2 de type S            *
  2435. *         a7(8) pointe sur i1 de type I             *
  2436. *    sortie : d0 pointe sur s2 + i1 de type I (zone creee)    *
  2437. *                                    *
  2438. *===================================================================*
  2439.  
  2440. _addsi:  link    a6,#0
  2441.     movem.l    d2-d4/a2,-(sp)
  2442.     move.l    12(a6),a1    
  2443.     move.l    8(a6),d2    
  2444.     bne.b     1f        
  2445.     move.w    6(a1),d0
  2446.     bsr     _geti        
  2447.     move.l    a0,d4
  2448.     subq.w    #2,d0        
  2449.     addq.l    #4,a0
  2450.     addq.l    #4,a1
  2451. 2:      move.l    (a1)+,(a0)+    
  2452.     dbra    d0,2b
  2453.     bra.w     addsif
  2454. 1:      tst.b    4(a1)
  2455.     bne.b     3f        
  2456.     moveq    #3,d0
  2457.     bsr     _geti        
  2458.     move.l    a0,d4
  2459.     move.l    #0x1000003,4(a0)
  2460.     move.l    d2,8(a0)
  2461.     
  2462.     bpl.w     addsif
  2463.     move.b    #0xff,4(a0)
  2464.     neg.l    8(a0)
  2465.     bra.b     addsif
  2466. 3:      move.w    6(a1),d0    
  2467.     bsr     _geti
  2468.     move.l    a0,d4
  2469.     move.w    4(a1),d1
  2470.     ext.l    d1        
  2471.     lea     (a0,d0.w*4),a0 
  2472.     lea     (a1,d0.w*4),a2 
  2473.     moveq    #0,d3
  2474.     subq.w    #3,d0        
  2475.     eor.l    d2,d1        
  2476.     bmi.b     susi        
  2477.     tst.l    d2
  2478.     bpl.b     L51         
  2479.     neg.l    d2
  2480. L51:     add.l    -(a2),d2
  2481.     bra.b     4f        
  2482. 5:      move.l    d2,-(a0)
  2483.     move.l    -(a2),d2
  2484.     addx.l    d3,d2
  2485. 4:      dbra    d0,5b
  2486.     bcc.b     6f        
  2487.     move.l    d2,-(a0)     
  2488.     moveq    #1,d0
  2489.     bsr     _geti        
  2490.     move.l    a0,d4
  2491.     move.l    4(a0),(a0)
  2492.     addq.w    #1,2(a0)    
  2493.     cmp.w    #0x7fff,2(a0)
  2494.     bls.b     7f
  2495.     move.l    #12,-(sp)
  2496.     jsr     _err
  2497. 7:      move.w    2(a0),6(a0)    
  2498.     move.l    #1,8(a0)    
  2499.     bra.b     8f
  2500. 6:      move.l    d2,-(a0)     
  2501.     subq.w    #8,a0
  2502.     move.w    2(a0),6(a0)    
  2503. 8:      move.w    4(a1),4(a0)    
  2504.     move.l    a0,d4
  2505. addsif:  move.l    d4,d0        
  2506.     movem.l    (sp)+,d2-d4/a2
  2507.     unlk    a6
  2508.     rts
  2509.     susi:     move.l    d2,d1        
  2510.     bpl.b     6f
  2511.     neg.l    d1        
  2512. 6:      move.l    -(a2),d2
  2513.     sub.l    d1,d2        
  2514.     bra.b     1f
  2515. 2:      move.l    d2,-(a0)
  2516.     move.l    -(a2),d2
  2517.     subx.l    d3,d2
  2518. 1:      dbra    d0,2b
  2519.     bcc.b     3f
  2520.     neg.l    d2
  2521.     move.l    d2,-(a0)
  2522.     subq.l    #8,a0        
  2523.     move.w    #3,6(a0)    
  2524.     move.b    4(a1),d2
  2525.     neg.b    d2
  2526.     move.b    d2,4(a0)    
  2527.     bra.b     addsif
  2528. 3:      tst.l    d2
  2529.     beq.b     4f
  2530.     move.l    d2,-(a0)
  2531.     move.l    4(a1),-(a0)     
  2532.     bra.b     addsif
  2533. 4:      move.l    4(a1),-(a0)
  2534.     subq.w    #1,2(a0)
  2535.     cmp.w    #2,2(a0)
  2536.     bne.b     5f
  2537.     clr.b    (a0)
  2538. 5:      move.l    -8(a0),-(a0)
  2539.     subq.w    #1,2(a0)
  2540.     move.l    a0,d4
  2541.     addq.l    #4,_avma        
  2542.     bra.b     addsif
  2543.  
  2544. *===================================================================*
  2545. *                                    *
  2546. *        Addition : entier + entier = entier         *
  2547. *                                    *
  2548. *    entree : a7(4) pointe sur i2 de type I             *
  2549. *         a7(8) pointe sur i1 de type I             *
  2550. *    sortie : d0 pointe sur i2 + i1 de type I (zone creee)    *
  2551. *                                    *
  2552. *===================================================================*
  2553.  
  2554. _addii:  link    a6,#0
  2555.     movem.l    d2-d7/a2-a4,-(sp)
  2556.     move.l    8(a6),a2    
  2557.     move.l    12(a6),a1    
  2558.     moveq    #0,d2
  2559.     moveq    #0,d1
  2560.     move.w    6(a2),d2
  2561.     move.w    6(a1),d1    
  2562.     cmp.w    d1,d2
  2563.     bcc.b     1f
  2564.     exg     a1,a2
  2565.     exg     d1,d2        
  2566. 1:      tst.b    4(a1)
  2567.     bne.b     2f        
  2568.     move.w    6(a2),d0
  2569.     bsr     _geti        
  2570.     subq.w    #2,d0        
  2571.     move.l    a0,a1
  2572.     addq.l    #4,a1
  2573.     addq.l    #4,a2
  2574. 3:      move.l    (a2)+,(a1)+
  2575.     dbra    d0,3b
  2576.     bra.w     addiif
  2577. 2:      move.b    4(a1),d3
  2578.     move.b    4(a2),d4
  2579.     eor.b    d4,d3        
  2580.     bmi.w     suii
  2581.     move.w    d2,d0
  2582.     bsr     _geti        
  2583.     lea     (a0,d0.w*4),a0 
  2584.     lea     (a2,d0.w*4),a2 
  2585.     lea     (a1,d1.w*4),a1 
  2586.     sub.w    d1,d2        
  2587.     subq.w    #3,d1        
  2588.     moveq    #0,d4
  2589. 4:      move.l    -(a1),d0
  2590.     move.l    -(a2),d5
  2591.     addx.l    d5,d0
  2592.     move.l    d0,-(a0)
  2593.     dbra    d1,4b
  2594.     roxr.w    d4,d0        
  2595.     bra.b     5f
  2596. 6:      move.l    -(a2),d0
  2597.     addx.l    d4,d0
  2598.     move.l    d0,-(a0)
  2599.     roxr.w    d4,d0
  2600. 5:      dbcc    d2,6b
  2601.     bcs.b     7f
  2602.     bra.b     8f
  2603. 9:      move.l    -(a2),-(a0)
  2604. 8:      dbra    d2,9b
  2605.     move.l    -(a2),-(a0)
  2606.     subq.l    #4,a0
  2607.     bra.b     addiif
  2608. 7:      move.w    -2(a2),d2
  2609.     addq.w    #1,d2
  2610.     cmp.w    #0x8000,d2
  2611.     bcs.b     L1005
  2612.     move.l    #13,-(sp)
  2613.     jsr     _err
  2614.     L1005:     moveq    #1,d0
  2615.     bsr     _geti
  2616.     move.l    #1,8(a0)    
  2617.     move.l    4(a0),(a0)
  2618.     move.w    d2,2(a0)    
  2619.     move.l    -(a2),4(a0)
  2620.     move.w    d2,6(a0)    
  2621. addiif:  move.l    a0,d0        
  2622. addiig:    movem.l    (sp)+,d2-d7/a2-a4
  2623.     unlk    a6
  2624.     rts
  2625.     suii:     move.l    a1,a3
  2626.     move.l    a2,a4        
  2627.     sub.w    d1,d2        
  2628.     bne.b     1f
  2629.     subq.w    #3,d1        
  2630.     addq.l    #8,a3
  2631.     addq.l    #8,a4        
  2632. 2:      cmpm.l    (a3)+,(a4)+
  2633.     dbne    d1,2b
  2634.     bhi.b     1f        
  2635.     bne.b     3f
  2636.     move.l    _gzero,d0
  2637.     bra.b     addiig
  2638. 3:      exg     a1,a2
  2639. 1:      move.w    6(a2),d0
  2640.     bsr     _geti        
  2641.     move.w    6(a1),d1    
  2642.     move.l    a0,-(sp)     
  2643.     move.b    4(a2),d7    
  2644.     lea     (a1,d1.w*4),a1 
  2645.     lea     (a2,d0.w*4),a2 
  2646.     lea     (a0,d0.w*4),a0 
  2647.     sub.l    d3,d3        
  2648.     subq.w    #3,d1        
  2649. 4:      move.l    -(a2),d0
  2650.     move.l    -(a1),d5
  2651.     subx.l    d5,d0
  2652.     move.l    d0,-(a0)
  2653.     dbra    d1,4b
  2654.     roxr.w    d3,d0        
  2655.     bra.b     5f
  2656. 6:      move.l    -(a2),d5
  2657.     subx.l    d3,d5
  2658.     move.l    d5,-(a0)
  2659.     roxr.w    d3,d0
  2660. 5:      dbcc    d2,6b
  2661.     bra.b     7f
  2662. 8:      move.l    -(a2),-(a0)
  2663. 7:      dbra    d2,8b
  2664.     move.l    (sp)+,a0     
  2665.     move.w    2(a0),d1    
  2666.     moveq    #0,d2
  2667.     move.w    d1,d2        
  2668.     addq.l    #8,a0        
  2669. 9:      tst.l    (a0)+
  2670.     dbne    d1,9b
  2671.     subq.l    #4,a0        
  2672.     move.l    d1,-(a0)     
  2673.     move.b    d7,(a0)        
  2674.     move.w    d1,-(a0)     
  2675.     move.w    #0x101,-(a0)     
  2676.     sub.w    d1,d2
  2677.     lsl.l    #2,d2
  2678.     add.l    d2,_avma        
  2679.     bra.w     addiif
  2680.  
  2681. *===================================================================*
  2682. *                                    *
  2683. *        Addition : entier court + reel = reel        *
  2684. *                                    *
  2685. *    entree : a7(4) contient s2 de type S            *
  2686. *         a7(8) pointe sur r1 de type R             *
  2687. *    sortie : d0 pointe sur s2 + r1 de type R (zone creee)    *
  2688. *                                    *
  2689. *===================================================================*
  2690.  
  2691. _addsr:  link    a6,#-12     
  2692.     move.l    8(a6),d1    
  2693.     bne.b     1f
  2694.     move.l    #0x1000002,-12(a6)
  2695.     move.l    #2,-8(a6)
  2696.     bra.b     3f
  2697. 1:      bmi.b     2f
  2698.     move.l    #0x1000003,-12(a6)
  2699.     move.l    #0x1000003,-8(a6)
  2700.     move.l    d1,-4(a6)
  2701.     bra.b     3f
  2702. 2:      move.l    #0x1000003,-12(a6)
  2703.     move.l    #0xff000003,-8(a6)
  2704.     neg.l    d1
  2705.     move.l    d1,-4(a6)
  2706. 3:      move.l    12(a6),-(sp)
  2707.     pea     -12(a6)
  2708.     bsr     _addir
  2709.     unlk    a6
  2710.     rts     
  2711.     
  2712. *===================================================================*
  2713. *                                    *
  2714. *        Addition : entier + reel = reel             *
  2715. *                                    *
  2716. *    entree : a7(4) pointe sur i2 de type I             *
  2717. *         a7(8) pointe sur r1 de type R             *
  2718. *    sortie : d0 pointe sur i2 + r1 de type R (zone creee)    *
  2719. *    precision : si exp2>=exp1 , L = L1 + int((exp2-exp1)/32) + 1*
  2720. *            si exp2<exp1  , L = L1                *
  2721. *            i2 est transforme en un reel            *
  2722. *                                    *
  2723. *===================================================================*
  2724.  
  2725. _addir:  link    a6,#-4        
  2726.     movem.l    d2-d3/a2,-(sp)
  2727.     move.l    8(a6),a2
  2728.     move.l    12(a6),a1    
  2729.     tst.b    4(a2)
  2730.     bne.b     1f
  2731. 6:      move.w    2(a1),d0
  2732.     bsr     _getr
  2733.     move.l    a0,-4(a6)    
  2734.     addq.l    #4,a1
  2735.     addq.l    #4,a0
  2736.     subq.w    #2,d0
  2737. 4:      move.l    (a1)+,(a0)+
  2738.     dbra    d0,4b
  2739.     bra.w     addirf
  2740. 1:      tst.b    4(a1)
  2741.     bne.b     3f
  2742.     move.l    4(a1),d1
  2743.     sub.l    #0x800000,d1
  2744.     asr.l    #5,d1
  2745.     moveq    #0,d0
  2746.     move.w    6(a2),d0
  2747.     sub.l    d1,d0        
  2748.     cmp.l    #3,d0
  2749.     bcs.w     2f
  2750.     cmp.l    #0x8000,d0
  2751.     bcc.w     2f
  2752.     bsr     _getr
  2753.     move.l    a0,-4(a6)
  2754.     move.l    a0,-(sp)
  2755.     move.l    a2,-(sp)
  2756.     bsr     _affir        
  2757.     addq.l    #8,sp        
  2758.     bra.w     addirf
  2759. 3:      move.l    8(a2),d0
  2760.     bfffo    d0{0:32},d1    
  2761.     moveq    #0,d0
  2762.     move.w    6(a2),d0
  2763.     subq.w    #2,d0
  2764.     lsl.l    #5,d0
  2765.     sub.l    d1,d0
  2766.     subq.l    #1,d0        
  2767.     moveq    #0,d3
  2768.     move.w    2(a1),d3    
  2769.     move.l    4(a1),d2
  2770.     and.l    #0xffffff,d2
  2771.     sub.l    #0x800000,d2    
  2772.     sub.l    d0,d2        
  2773.     ble.b     5f
  2774.     lsr.l    #5,d2        
  2775.     sub.l    d2,d3        
  2776.     cmp.l    #2,d3
  2777.     ble.w     6b
  2778. 7:      move.l    _avma,-(sp)    
  2779.     move.w    d3,d0
  2780.     bsr     _getr        
  2781.     move.l    a0,-(sp)     
  2782.     move.l    a2,-(sp)     
  2783.     bsr     _affir
  2784.     move.l    a1,(sp)        
  2785.     bsr     _addrr
  2786.     move.l    d0,a0        
  2787.     move.w    2(a0),d0    
  2788.     subq.w    #1,d0        
  2789.     move.l    4(sp),a1    
  2790.     addq.l    #8,sp        
  2791.     moveq    #0,d1
  2792.     move.w    2(a1),d1
  2793.     lsl.l    #2,d1        
  2794.     
  2795.     move.l    (sp)+,a0     
  2796. 8:      move.l    -(a1),-(a0)
  2797.     dbra    d0,8b
  2798.     add.l    d1,_avma    
  2799.     move.l    a0,-4(a6)
  2800.     bra.b     addirf
  2801. 5:      neg.l    d2
  2802.     lsr.l    #5,d2        
  2803.     add.w    d2,d3
  2804.     addq.w    #1,d3        
  2805.     cmp.w    #0x8000,d3
  2806.     bcs.b     7b
  2807. 2:      move.l    #14,-(sp)
  2808.     jsr     _err
  2809. addirf:  move.l    -4(a6),d0    
  2810.     movem.l    (sp)+,d2-d3/a2
  2811.     unlk    a6
  2812.     rts
  2813.  
  2814. *===================================================================*
  2815. *                                    *
  2816. *        Addition : reel + reel = reel            *
  2817. *                                    *
  2818. *    entree : a7(4) pointe sur r2 de type R             *
  2819. *         a7(8) pointe sur r1 de type R             *
  2820. *    sortie : d0 pointe sur r2 + r1 de type R (zone creee)    *
  2821. *    precision : L = inf ( L2 , L1 + [(exp2-exp1)/32])        *
  2822. *            si exp2 >= exp1 (sinon echanger r1 et r2)    *
  2823. *                                    *
  2824. *===================================================================*
  2825.  
  2826. _addrr:  link    a6,#-16
  2827.     movem.l    d2-d7/a2-a4,-(sp)
  2828.     move.l    8(a6),a2    
  2829.     move.l    12(a6),a1    
  2830.     tst.b    4(a2)
  2831.     bne.w     1f
  2832. 4:      tst.b    4(a1)
  2833.     bne.b     L22
  2834.     move.l    4(a1),d1
  2835.     cmp.l    4(a2),d1
  2836.     bgt.b     L23
  2837.     move.l    4(a2),d1    
  2838. L23:     moveq    #3,d0
  2839.     bsr     _getr
  2840.     move.l    a0,-8(a6)
  2841.     move.l    d1,4(a0)
  2842.     clr.l    8(a0)
  2843.     bra.w     addrrf
  2844.     L22:     moveq    #0,d0
  2845.     move.l    4(a2),d2    
  2846.     move.l    4(a1),d1
  2847.     and.l    #0xffffff,d1    
  2848.     sub.l    d2,d1        
  2849.     bcc.b     L24
  2850.     moveq    #3,d0
  2851.     bsr     _getr
  2852.     move.l    a0,-8(a6)    
  2853.     move.l    4(a2),4(a0)
  2854.     clr.l    8(a0)
  2855.     bra.w     addrrf
  2856.     L24:     lsr.l    #5,d1        
  2857.     move.w    2(a1),d0
  2858.     subq.w    #2,d0        
  2859.     cmp.l    d1,d0
  2860.     ble.b     L25
  2861.     move.l    d1,d0        
  2862.     addq.l    #1,d0        
  2863. L25:     addq.l    #2,d0        
  2864.     bsr     _getr
  2865.     move.l    a0,-8(a6)
  2866.     addq.l    #4,a1
  2867.     addq.l    #4,a0
  2868.     subq.w    #2,d0
  2869. L27:     move.l    (a1)+,(a0)+
  2870.     dbra    d0,L27
  2871.     bra.w     addrrf
  2872. 1:      tst.b    4(a1)
  2873.     bne.b     3f
  2874.     exg     a2,a1
  2875.     bra.b     L22
  2876. 3:      move.b    4(a1),d3
  2877.     move.b    4(a2),d5
  2878.     eor.b    d5,d3        
  2879.     move.b    d3,-2(a6)    
  2880.     move.l    4(a2),d3
  2881.     and.l    #0xffffff,d3    
  2882.     move.l    4(a1),d1
  2883.     and.l    #0xffffff,d1    
  2884.     sub.l    d1,d3        
  2885.     beq.w     5f
  2886.     bcc.b     6f        
  2887.     exg     a1,a2
  2888.     neg.l    d3        
  2889. 6:      move.w    d3,d4
  2890.     and.w    #31,d4
  2891.     lsr.l    #5,d3        
  2892.     moveq    #0,d2
  2893.     move.w    2(a2),d2
  2894.     subq.w    #2,d2        
  2895.     cmp.l    d2,d3
  2896.     bcs.b     7f
  2897.     move.w    2(a2),d0
  2898.     bsr     _getr
  2899.     move.l    a0,-8(a6)
  2900.     addq.l    #4,a2
  2901.     addq.l    #4,a0
  2902.     subq.w    #2,d0
  2903. L28:     move.l    (a2)+,(a0)+
  2904.     dbra    d0,L28
  2905.     bra.w     addrrf
  2906. 7:      moveq    #0,d1
  2907.     move.w    2(a1),d1
  2908.     subq.w    #2,d1        
  2909.     move.l    d3,d5
  2910.     add.l    d1,d5        
  2911.     cmp.l    d2,d5
  2912.     bcs.b     8f
  2913.     move.b    #1,-4(a6)    
  2914.             move.w    d2,d0
  2915.     addq.w    #2,d0        
  2916.     bsr     _getr        
  2917.     move.l    a0,-8(a6)    
  2918.     move.w    d2,d5
  2919.     sub.w    d3,d5        
  2920.     move.w    d5,d0
  2921.     addq.w    #1,d0        
  2922.     bsr     _getr        
  2923.     subq.w    #2,d0        
  2924.     move.w    2(a2),d1
  2925.     lea     (a2,d1.w*4),a2 
  2926.     bra.b     9f
  2927. 8:      clr.b    -4(a6)     
  2928.     move.w    d5,d0
  2929.     addq.w    #3,d0        
  2930.     bsr     _getr        
  2931.     move.l    a0,-8(a6)    
  2932.     lea     (a2,d0.w*4),a2 
  2933.     move.w    2(a1),d5    
  2934.     move.w    d5,d0        
  2935.     subq.w    #2,d5        
  2936.     bsr     _getr        
  2937.     subq.w    #3,d0        
  2938. 9:      move.l    a0,-12(a6)     
  2939.     addq.l    #4,a0
  2940.     move.l    a0,a3        
  2941.     addq.l    #8,a1        
  2942. L29:     move.l    (a1)+,(a0)+
  2943.     dbra    d0,L29        
  2944.     tst.w    d4        
  2945.     bne.b     L1006
  2946.             moveq    #0,d7
  2947.     move.w    -2(a3),d7
  2948.     subq.w    #1,d7        
  2949.     move.w    d7,d2
  2950.     subq.w    #1,d2        
  2951.     lea     (a3,d7.w*4),a3 
  2952.     move.l    a3,a1        
  2953.     bra.b     L1106
  2954.     L1006:     subq.w    #1,d5
  2955.     move.w    d5,d2        
  2956.     move.l    #-1,d6
  2957.     lsr.l    d4,d6        
  2958.     moveq    #0,d0
  2959.     L1203:     move.l    (a3),d7
  2960.     ror.l    d4,d7
  2961.     move.l    d7,d1
  2962.     and.l    d6,d1
  2963.     sub.l    d1,d7
  2964.     add.l    d1,d0
  2965.     move.l    d0,(a3)+
  2966.     move.l    d7,d0
  2967.     dbra    d5,L1203
  2968.     move.l    a3,a1
  2969.     tst.b    -4(a6)
  2970.     bne.b     L1106         
  2971.     move.l    d0,(a1)+
  2972.     addq.w    #1,d2        
  2973. L1106:     move.l    -8(a6),a0    
  2974.     moveq    #0,d1
  2975.     move.w    2(a0),d1
  2976.     lea     (a0,d1.w*4),a0 
  2977.     bra.b     L1402
  2978. 5:      move.b    #2,-4(a6)    
  2979.     move.l    d1,-16(a6)     
  2980.     move.w    2(a1),d0
  2981.     cmp.w    2(a2),d0
  2982.     bcs.b     L1502
  2983.     move.w    2(a2),d0
  2984. L1502:     bsr     _getr        
  2985.     move.l    a0,-8(a6)    
  2986.     moveq    #0,d2
  2987.     move.w    d0,d2
  2988.     move.l    d2,d0
  2989.     subq.w    #3,d2
  2990.     moveq    #0,d3
  2991.     move.l    a2,a4
  2992.     move.l    a1,a3
  2993.     lea     (a0,d0.w*4),a0 
  2994.     lea     (a1,d0.w*4),a1 
  2995.     lea     (a2,d0.w*4),a2 
  2996.     L1402:     sub.l    d4,d4        
  2997.     tst.b    -2(a6)     
  2998.     bne.w     surr
  2999.     L1602:     move.l    -(a1),d1
  3000.     move.l    -(a2),d5
  3001.     addx.l    d5,d1
  3002.     move.l    d1,-(a0)
  3003.     dbra    d2,L1602
  3004.     roxr.w    d4,d0        
  3005.     bcc.b     L1702         
  3006.     bra.b     L1802
  3007.     L1902:     move.l    -(a2),d5
  3008.     addx.l    d4,d5
  3009.     move.l    d5,-(a0)
  3010.     roxr.w    d4,d0        
  3011. L1802:     dbcc    d3,L1902
  3012.     bcs.b     L2002         
  3013.     bra.b     L1702
  3014.     L30:     move.l    -(a2),-(a0)
  3015. L1702:     dbra    d3,L30
  3016.     move.l    -(a2),-(a0)    
  3017.     cmp.b    #2,-4(a6)
  3018.     beq.b     addrrf        
  3019.     move.l    -12(a6),a0
  3020.     bsr     _giv
  3021.     bra.b     addrrf
  3022.     L2002:     move.l    -(a2),d1
  3023.     and.l    #0xffffff,d1
  3024.     addq.l    #1,d1        
  3025.     cmp.l    #0x1000000,d1
  3026.     blt.b     2f
  3027.     move.l    #15,-(sp)
  3028.     jsr     _err
  3029. 2:      cmp.b    #2,-4(a6)
  3030.     beq.b     L1303
  3031.     move.l    a0,a3
  3032.     move.l    -12(a6),a0
  3033.     bsr     _giv
  3034.     move.l    a3,a0
  3035. L1303:     move.l    d1,-4(a0)
  3036.     move.b    (a2),-4(a0)     
  3037.     move.w    -6(a0),d2
  3038.     subq.w    #3,d2        
  3039.     move.w    #-1,d0
  3040.     move.w    d0,ccr        
  3041. L31:     roxr.w    (a0)+
  3042.     roxr.w    (a0)+        
  3043.     dbra    d2,L31        
  3044. addrrf:  move.l    -8(a6),d0    
  3045.     movem.l    (sp)+,d2-d7/a2-a4
  3046.     unlk    a6
  3047.     rts
  3048.     surr:     moveq    #0,d6
  3049.     move.w    d2,d6
  3050.     move.w    d2,d7
  3051.     add.w    d3,d7
  3052.     addq.w    #3,d7
  3053.     cmp.b    #2,-4(a6)
  3054.     bne.b     1f
  3055.     addq.l    #8,a3
  3056.     addq.l    #8,a4
  3057. L1204:     cmpm.l    (a3)+,(a4)+
  3058.     dbne    d2,L1204
  3059.     bhi.b     1f        
  3060.     bne.b     2f    
  3061.     move.l    -8(a6),a0    
  3062.     moveq    #0,d2        
  3063.     move.w    2(a0),d2
  3064.     subq.w    #2,d2
  3065.     lsl.l    #5,d2    
  3066.     neg.l    d2
  3067.     add.l    -16(a6),d2     
  3068.     bpl.b     L1503
  3069.     move.l    #16,-(sp)    
  3070.     jsr     _err
  3071. L1503:     cmp.l    #0x1000000,d2
  3072.     blt.b     L1603
  3073.     move.l    #15,-(sp)
  3074.     jsr     _err
  3075. L1603:     bsr     _giv
  3076.     moveq    #3,d0
  3077.     bsr     _getr
  3078.     move.l    a0,-8(a6)
  3079.     move.l    d2,4(a0)
  3080.     clr.l    8(a0)
  3081.     bra.b     addrrf
  3082. 2:      exg     a1,a2
  3083. 1:      sub.w    d2,d6
  3084.     sub.l    d4,d4        
  3085. 3:      move.l    -(a2),d0
  3086.     move.l    -(a1),d5
  3087.     subx.l    d5,d0
  3088.     move.l    d0,-(a0)
  3089.     dbra    d2,3b
  3090.     roxr.w    d4,d0        
  3091.     bra.b     4f
  3092. 5:      move.l    -(a2),d5
  3093.     subx.l    d4,d5
  3094.     move.l    d5,-(a0)
  3095.     roxr.w    d4,d0
  3096. 4:      dbcc    d3,5b
  3097.     bra.b     6f
  3098.     L1304:     move.l    -(a2),-(a0)
  3099. 6:      dbra    d3,L1304
  3100.     moveq    #0,d3
  3101.     moveq    #-1,d2
  3102.     move.w    d2,d3
  3103. L1403:     tst.l    (a0)+
  3104.     dbne    d2,L1403        
  3105.     sub.w    d2,d3        
  3106.     add.w    d6,d3
  3107.     sub.l    #12,a0        
  3108.     move.l    a0,-8(a6)
  3109.     move.l    a0,a1        
  3110.     cmp.b    #2,-4(a6)
  3111.     beq.b     7f        
  3112.     move.l    -12(a6),a0
  3113.     bsr     _giv
  3114. 7:      moveq    #0,d0
  3115.     move.w    d3,d0
  3116.     lsl.l    #2,d0        
  3117.     add.l    d0,_avma    
  3118.     move.l    a1,a0        
  3119.     move.w    #0x201,(a0)
  3120.     sub.w    d3,d7
  3121.     move.w    d7,2(a0)    
  3122.     lsl.l    #5,d3
  3123.     move.l    8(a0),d0
  3124.     bfffo    d0{0:32},d1    
  3125.     lsl.l    d1,d0        
  3126.     add.l    d1,d3
  3127.     lsl.l    #2,d6
  3128.     sub.l    d6,a2
  3129.     move.l    -4(a2),d2
  3130.     and.l    #0xffffff,d2
  3131.     sub.l    d3,d2
  3132.     move.l    d2,4(a0)    
  3133.     move.b    -4(a2),4(a0)    
  3134.     tst.b    d1
  3135.     bne.b     8f        
  3136.     bra.b     9f
  3137. 8:      moveq    #1,d6
  3138.     lsl.l    d1,d6
  3139.     subq.l    #1,d6        
  3140.     addq.l    #8,a1
  3141.     subq.w    #3,d7        
  3142.     bra.b     L1007
  3143.     L1107:     move.l  4(a1),d2
  3144.     rol.l    d1,d2
  3145.     move.l    d2,d3
  3146.     and.l    d6,d3
  3147.     sub.l    d3,d2
  3148.     add.l    d3,d0
  3149.     move.l    d0,(a1)+
  3150.     move.l    d2,d0
  3151. L1007:     dbra    d7,L1107
  3152.     move.l    d0,(a1)
  3153. 9:      bra.w     addrrf
  3154.  
  3155.  
  3156.  
  3157.  
  3158.  
  3159. *********************************************************************
  3160. *********************************************************************
  3161. ***                                   ***
  3162. ***             PROGRAMMES DE SOUSTRACTION          ***
  3163. ***                                   ***
  3164. *********************************************************************
  3165. *********************************************************************
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171. *===================================================================*
  3172. *                                    *
  3173. *            Soustraction generale            *
  3174. *                                    *
  3175. *    entree : a7(4) pointe sur n2 de type I ou R        *
  3176. *         a7(8) pointe sur n1 de type I ou R        *
  3177. *    sortie : d0 pointe sur n2 - n1 de type I ou R (zone creee)    *
  3178. *    interdit : type S                        *
  3179. *                                    *
  3180. *===================================================================*
  3181.  
  3182. _mpsub:  cmp.b    #1,([8,sp])
  3183.     bne.b     1f
  3184.     cmp.b    #1,([4,sp])
  3185.     beq.w     _subii
  3186.     bra.w     _subri
  3187. 1:      cmp.b    #1,([4,sp])
  3188.     beq.w     _subir
  3189.     bra.w     _subrr
  3190.  
  3191. *===================================================================*
  3192. *                                    *
  3193. *            Soustraction (par valeur)            *
  3194. *                                    *
  3195. *    entree : a7(4) pointe sur n2 de type I ou R        *
  3196. *         a7(8) pointe sur n1 de type I ou R        *
  3197. *         a7(12) pointe sur n3 de type I ou R        *
  3198. *    sortie : la zone pointee par a7(12) contient n2 - n1    *
  3199. *    interdit : type S                        *
  3200. *                                    *
  3201. *===================================================================*
  3202.  
  3203. _mpsubz: lea     _mpsub,a0
  3204.     bra.w     mpopz
  3205.  
  3206.     
  3207. _subssz: lea     _subss,a0
  3208.     bra.w     mpopz
  3209.  
  3210.     
  3211. _subsiz: lea     _subsi,a0
  3212.     bra.w     mpopz
  3213.  
  3214.     
  3215. _subsrz: lea     _subsr,a0
  3216.     bra.w     mpopz
  3217.  
  3218.     
  3219. _subisz: lea     _subis,a0
  3220.     bra.w     mpopz
  3221.  
  3222.     
  3223. _subiiz: lea     _subii,a0
  3224.     bra.w     mpopz
  3225.  
  3226.     
  3227. _subirz: lea     _subir,a0
  3228.     bra.w     mpopz
  3229.  
  3230.     
  3231. _subrsz: lea     _subrs,a0
  3232.     bra.w     mpopz
  3233.  
  3234.     
  3235. _subriz: lea     _subri,a0
  3236.     bra.w     mpopz
  3237.  
  3238.     
  3239. _subrrz: lea     _subrr,a0
  3240.     bra.w     mpopz
  3241.  
  3242. *===================================================================*
  3243. *                                    *
  3244. *    Soustraction : entier court - entier court = entier     *
  3245. *                                    *
  3246. *    entree : a7(4) contient s2 de type S            *
  3247. *         a7(8) contient s1 de type S            *
  3248. *    sortie : d0 pointe sur s2 - s1 de type I (zone creee)    *
  3249. *    remarque : s2 - s1 = s0 est interdit            *
  3250. *                                    *
  3251. *===================================================================*
  3252.  
  3253. _subss:  link    a6,#-12
  3254.     move.l    12(a6),d1    
  3255.     neg.l    d1        
  3256.     bvs.b     1f
  3257.     move.l    d1,-(sp)     
  3258.     move.l    8(a6),-(sp)     
  3259.     bsr     _addss        
  3260.     bra.b     subssf
  3261. 1:      move.l    #0x1000003,-12(a6)
  3262.     move.l    #0x1000003,-8(a6)
  3263.     move.l    #0x80000000,-4(a6)
  3264.     pea     -12(a6)    
  3265.     move.l    8(a6),-(sp)     
  3266.     bsr     _addsi
  3267. subssf:  unlk    a6
  3268.     rts
  3269.  
  3270. *===================================================================*
  3271. *                                    *
  3272. *        Soustraction : entier - entier = entier         *
  3273. *                                    *
  3274. *    entree : a7(4) pointe sur i2 de type I             *
  3275. *         a7(8) pointe sur i1 de type I             *
  3276. *    sortie : d0 pointe sur i2 - i1 de type I (zone creee)    *
  3277. *                                    *
  3278. *===================================================================*
  3279.  
  3280. _subii:  link    a6,#-4
  3281.     move.l    12(a6),-(sp)    
  3282.     move.l    8(a6),-(sp)     
  3283.     move.l    12(a6),a0    
  3284.     neg.b    4(a0)        
  3285.     move.l    a0,-4(a6)
  3286.     bsr     _addii
  3287.     move.l    -4(a6),a0
  3288.     neg.b    4(a0)        
  3289.     unlk    a6
  3290.     rts
  3291.  
  3292. *===================================================================*
  3293. *                                    *
  3294. *        Soustraction : reel - reel = reel            *
  3295. *                                    *
  3296. *    entree : a7(4) pointe sur r2 de type R             *
  3297. *         a7(8) pointe sur r1 de type R             *
  3298. *    sortie : d0 pointe sur r2 - r1 de type R (zone creee)    *
  3299. *                                    *
  3300. *===================================================================*
  3301.  
  3302. _subrr:  link    a6,#-4        
  3303.     move.l    12(a6),-(sp)
  3304.     move.l    8(a6),-(sp)
  3305.     move.l    12(a6),a0
  3306.     neg.b    4(a0)
  3307.     move.l    a0,-4(a6)
  3308.     bsr     _addrr
  3309.     move.l    -4(a6),a0
  3310.     neg.b    4(a0)
  3311.     unlk    a6
  3312.     rts
  3313.  
  3314. *===================================================================*
  3315. *                                    *
  3316. *    Soustraction : entier court - entier = entier        *
  3317. *                                    *
  3318. *    entree : a7(4) contient s2 de type S            *
  3319. *         a7(8) pointe sur i1 de type I             *
  3320. *    sortie : d0 pointe sur s2 - i1 de type I            *
  3321. *                                    *
  3322. *===================================================================*
  3323.  
  3324. _subsi:  link    a6,#-4        
  3325.     move.l    12(a6),-(sp)
  3326.     move.l    8(a6),-(sp)
  3327.     move.l    12(a6),a0
  3328.     neg.b    4(a0)
  3329.     move.l    a0,-4(a6)
  3330.     bsr     _addsi
  3331.     move.l    -4(a6),a0
  3332.     neg.b    4(a0)
  3333.     unlk    a6
  3334.     rts
  3335.  
  3336. *===================================================================*
  3337. *                                    #    
  3338. *        Soustraction : entier court - reel = reel        *
  3339. *                                    *
  3340. *    entree : a7(4) contient s2 de type S            *
  3341. *         a7(8) pointe sur r1 de type R             *
  3342. *    sortie : d0 pointe sur s2 - r1 de type R (zone creee)    *
  3343. *                                    *
  3344. *===================================================================*
  3345.  
  3346. _subsr:  link    a6,#-4        
  3347.     move.l    12(a6),-(sp)
  3348.     move.l    8(a6),-(sp)
  3349.     move.l    12(a6),a0
  3350.     neg.b    4(a0)
  3351.     move.l    a0,-4(a6)
  3352.     bsr     _addsr
  3353.     move.l    -4(a6),a0
  3354.     neg.b    4(a0)
  3355.     unlk    a6
  3356.     rts
  3357.  
  3358. *===================================================================*
  3359. *                                    *
  3360. *    Soustraction : entier - entier court = entier        *
  3361. *                                    *
  3362. *    entree : a7(4) pointe sur i1 de type I             *
  3363. *         a7(8) contient s2 de type S            *
  3364. *    sortie : d0 pointe sur i1 - s2 de type I (zone creee)    *
  3365. *                                    *
  3366. *===================================================================*
  3367.  
  3368. _subis:  link    a6,#-12     
  3369.     move.l    8(a6),-(sp)
  3370.     move.l    12(a6),d1
  3371.     neg.l    d1
  3372.     bvs.b     1f
  3373.     move.l    d1,-(sp)
  3374.     bsr     _addsi
  3375.     bra.b     subisf
  3376. 1:      move.l    #0x1000003,-12(a6)
  3377.     move.l    #0x1000003,-8(a6)
  3378.     move.l    #0x80000000,-4(a6)
  3379.     pea     -12(a6)
  3380.     bsr     _addii
  3381. subisf:  unlk    a6
  3382.     rts
  3383.  
  3384. *===================================================================*
  3385. *                                    *
  3386. *        Soustraction : entier - reel = reel         *
  3387. *                                    *
  3388. *    entree : a7(4) pointe sur i2 de type I             *
  3389. *         a7(8) pointe sur r1 de type R             *
  3390. *    sortie : d0 pointe sur i2 - r1 de type R (zone creee)    *
  3391. *                                    *
  3392. *===================================================================*
  3393.  
  3394. _subir:  link    a6,#-4        
  3395.     move.l    12(a6),-(sp)
  3396.     move.l    8(a6),-(sp)
  3397.     move.l    12(a6),a0
  3398.     neg.b    4(a0)
  3399.     move.l    a0,-4(a6)
  3400.     bsr     _addir
  3401.     move.l    -4(a6),a0
  3402.     neg.b    4(a0)
  3403.     unlk    a6
  3404.     rts
  3405.  
  3406. *===================================================================*
  3407. *                                    *
  3408. *        Soustraction : reel - entier = reel         *
  3409. *                                    *
  3410. *    entree : a7(4) pointe sur r1 de type R             *
  3411. *         a7(8) pointe sur i2 de type I             *
  3412. *    sortie : d0 pointe sur r2 - i1 de type R (zone creee)    *
  3413. *                                    *
  3414. *===================================================================*
  3415.  
  3416. _subri:  link    a6,#-4        
  3417.     move.l    8(a6),-(sp)
  3418.     move.l    12(a6),-(sp)
  3419.     move.l    12(a6),a0
  3420.     neg.b    4(a0)
  3421.     move.l    a0,-4(a6)
  3422.     bsr     _addir
  3423.     move.l    -4(a6),a0
  3424.     neg.b    4(a0)
  3425.     unlk    a6
  3426.     rts
  3427.  
  3428. *===================================================================*
  3429. *                                    *
  3430. *    Soustraction : reel - entier court = reel            *
  3431. *                                    *
  3432. *    entree : a7(4) pointe sur r2 de type R             *
  3433. *         a7(8) contient s1 de type S            *
  3434. *    sortie : d0 pointe sur r2 - s1 de type R (zone creee)    *
  3435. *                                    *
  3436. *===================================================================*
  3437.  
  3438. _subrs:  link    a6,#-12     
  3439.     move.l    8(a6),-(sp)
  3440.     move.l    12(a6),d1
  3441.     neg.l    d1
  3442.     bvs.b     1f
  3443.     move.l    d1,-(sp)
  3444.     bsr     _addsr
  3445.     bra.b     subsrf
  3446. 1:      move.l    #0x1000003,-12(a6)
  3447.     move.l    #0x1000003,-8(a6)
  3448.     move.l    #0x80000000,-4(a6)
  3449.     pea     -12(a6)
  3450.     bsr     _addir
  3451. subsrf:  unlk    a6
  3452.     rts
  3453.  
  3454.  
  3455.  
  3456.  
  3457.  
  3458. *********************************************************************
  3459. *********************************************************************
  3460. ***                                   ***
  3461. ***             PROGRAMMES DE MULTIPLICATION          ***
  3462. ***                                   ***
  3463. *********************************************************************
  3464. *********************************************************************
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470. *===================================================================*
  3471. *                                    *
  3472. *            Multiplication generale             *
  3473. *                                    *
  3474. *    entree : a7(4) pointe sur n2 de type I ou R        *
  3475. *         a7(8) pointe sur n1 de type I ou R        *
  3476. *    sortie : d0 pointe sur n2 * n1 de type I ou R (zone cree)    *
  3477. *    interdit : type S                        *
  3478. *    precision : voir routines specialisees            *
  3479. *                                    *
  3480. *===================================================================*
  3481.  
  3482. _mpmul:  move.l    4(sp),a0
  3483.     move.l    8(sp),a1    
  3484.     move.b    (a0),d0
  3485.     move.b    (a1),d1        
  3486.     cmp.b    d1,d0
  3487.     ble.b     1f
  3488.     exg     a1,a0
  3489.     exg     d1,d0
  3490.     move.l    a0,4(sp)
  3491.     move.l    a1,8(sp)
  3492. 1:      cmp.b    #1,d1
  3493.     beq.w     _mulii        
  3494. 2:      cmp.b    #2,d0
  3495.     beq.w     _mulrr        
  3496.     bra.w     _mulir
  3497.  
  3498. *===================================================================*
  3499. *                                    *
  3500. *        Multiplication (par valeur)             *
  3501. *                                    *
  3502. *    entree : a7(4) pointe sur n2 de type I ou R        *
  3503. *         a7(8) pointe sur n1 de type I ou R        *
  3504. *         a7(12) pointe sur n3 de type I ou R        *
  3505. *    sortie : la zone pointee par a7(12) contient n2*n1     *
  3506. *    interdit : type S                        *
  3507. *                                    *
  3508. *===================================================================*
  3509.  
  3510. _mpmulz: lea     _mpmul,a0
  3511.     bra.w     mpopz
  3512.  
  3513.     
  3514. _mulssz: lea     _mulss,a0
  3515.     bra.w     mpopz
  3516.  
  3517.     
  3518. _mulsiz: lea     _mulsi,a0
  3519.     bra.w     mpopz
  3520.  
  3521.     
  3522. _mulsrz: lea     _mulsr,a0
  3523.     bra.w     mpopz
  3524.  
  3525.     
  3526. _muliiz: lea     _mulii,a0
  3527.     bra.w     mpopz
  3528.  
  3529.     
  3530. _mulirz: lea     _mulir,a0
  3531.     bra.w     mpopz
  3532.  
  3533.     
  3534. _mulrrz: lea     _mulrr,a0
  3535.     bra.w     mpopz
  3536.  
  3537. *===================================================================*
  3538. *                                    *
  3539. *    Multiplication : entier court * entier court = entier    *
  3540. *                                    *
  3541. *    entree : a7(4) contient s2 de type S            *
  3542. *         a7(8) contient s1 de type S            *
  3543. *    sortie : d0 pointe sur s2 * s1 de type I (zone creee)    *
  3544. *                                    *
  3545. *===================================================================*
  3546.  
  3547. _mulss:  link    a6,#-2
  3548.     movem.l    d2-d4,-(sp)
  3549.     move.l    8(a6),d2    
  3550.     bne.b     1f
  3551. 2:      move.l    _gzero,d0
  3552.     bra.b     mulssg
  3553. 1:      move.l    d2,d4
  3554.     bpl.b     3f
  3555.     neg.l    d2        
  3556. 3:      move.l    12(a6),d1    
  3557.     beq.b     2b        
  3558.     eor.l    d1,d4        
  3559.     tst.l    d1
  3560.     bpl.b     4f
  3561.     neg.l    d1        
  3562. 4:      mulu.l    d1,d3:d2
  3563.     move.w    #4,d0
  3564.     tst.l    d3
  3565.     bne.b     5f
  3566.     move.w    #3,d0        
  3567. 5:      bsr     _geti
  3568.     move.w    2(a0),6(a0)    
  3569.     move.b    #1,4(a0)    
  3570.     tst.l    d4
  3571.     bpl.b     6f
  3572.     neg.b    4(a0)
  3573. 6:      tst.l    d3
  3574.     bne.b     7f
  3575.     move.l    d2,8(a0)
  3576.     bra.b     mulssf
  3577. 7:      move.l    d3,8(a0)
  3578.     move.l    d2,12(a0)
  3579. mulssf:  move.l    a0,d0
  3580. mulssg:    movem.l    (sp)+,d2-d4
  3581.     unlk    a6
  3582.     rts
  3583.  
  3584.  
  3585. _mulmodll: move.l 4(sp),d1
  3586.     mulu.l    8(sp),d0:d1
  3587.     divu.l    12(sp),d0:d1
  3588.     rts
  3589.  
  3590.  
  3591. *===================================================================*
  3592. *                                    *
  3593. *    Multiplication : entier court * entier = entier         *
  3594. *                                    *
  3595. *    entree : a7(4) contient s2 de type S            *
  3596. *         a7(8) pointe sur i1 de type I             *
  3597. *    sortie : d0 pointe sur s2 * i1    de type I (zone creee)    *
  3598. *                                    *
  3599. *===================================================================*
  3600.  
  3601. _mulsi:  link    a6,#0
  3602.     movem.l    d2-d6/a2,-(sp)
  3603.     move.l    8(a6),d2    
  3604.     bne.b     1f
  3605. 2:      move.l    _gzero,d0
  3606.     bra.b     mulsig
  3607. 1:      bpl.b     6f
  3608.     neg.l    d2        
  3609. 6:      move.l    12(a6),a1    
  3610.     tst.b    4(a1)
  3611.     beq.b     2b        
  3612.     move.w    6(a1),d0    
  3613.     bsr     _geti
  3614.     lea     (a0,d0.w*4),a2 
  3615.     lea     (a1,d0.w*4),a1 
  3616.     subq.w    #3,d0
  3617.     moveq    #0,d6
  3618.     moveq    #0,d5        
  3619. 3:      move.l    -(a1),d4
  3620.     mulu.l    d2,d3:d4
  3621.     add.l    d5,d4
  3622.     addx.l    d6,d3
  3623.     move.l    d4,-(a2)
  3624.     move.l    d3,d5
  3625.     dbra    d0,3b
  3626.     beq.b     5f
  3627.     move.w    #1,d0
  3628.     bsr     _geti
  3629.     move.w    6(a0),d0
  3630.     addq.w    #1,d0        
  3631.     bvc.b     4f
  3632.     move.l    #19,-(sp)
  3633.     jsr     _err
  3634. 4:      move.w    d0,2(a0)    
  3635.     move.l    d5,8(a0)    
  3636. 5:      move.w    2(a0),6(a0)    
  3637.     move.b    -4(a1),4(a0)
  3638.     tst.l    8(a6)
  3639.     bpl.b     mulsif
  3640.     neg.b    4(a0)        
  3641. mulsif:  move.l    a0,d0    
  3642. mulsig:    movem.l    (sp)+,d2-d6/a2
  3643.     unlk    a6
  3644.     rts
  3645.  
  3646. *===================================================================*
  3647. *                                    *
  3648. *        Multiplication : entier court * reel = reel     *
  3649. *                                    *
  3650. *    entree : a7(4) contient s2 de type S            *
  3651. *         a7(8) pointe sur r1 de type R             *
  3652. *    sortie : d0 pointe sur s2 * r1 de type R            *
  3653. *             de longueur L = L1 (zone creee)        *
  3654. *                                    *
  3655. *===================================================================*
  3656.  
  3657. _mulsr:  link    a6,#-4
  3658.     movem.l    d2-d6/a2,-(sp)
  3659.     move.l    8(a6),d2    
  3660.     bne.b     1f
  3661.     move.l    _gzero,d0
  3662.     bra.w     mulsrf1
  3663. 1:      move.l    12(a6),a1    
  3664.     tst.b    4(a1)
  3665.     bne.b     2f
  3666.     moveq    #3,d0
  3667.     bsr     _getr
  3668.     tst.l    d2
  3669.     bpl.b     2f
  3670.     neg.l    d2
  3671.     bfffo    d2{0:32},d0
  3672.     move.l    4(a1),d1
  3673.     add.l    #31,d1
  3674.     sub.l    d0,d1
  3675.     cmp.l    #0x1000000,d1
  3676.     bcc.w     L1108
  3677.     move.l    d1,4(a0)
  3678.     clr.l    8(a0)
  3679.     move.l    a0,d0
  3680.     bra.w     mulsrf1
  3681. 2:      move.w    2(a1),d0
  3682.     bsr     _getr        
  3683.     move.l    a0,-4(a6)    
  3684.     move.l    d2,d4
  3685.     bpl.b     3f
  3686.     neg.l    d2        
  3687. 3:      cmp.l    #1,d2
  3688.     bne.b     4f
  3689.     addq.l    #4,a0
  3690.     addq.l    #4,a1
  3691.     subq.w    #2,d0
  3692. 5:      move.l    (a1)+,(a0)+
  3693.     dbra    d0,5b
  3694.     move.l    -4(a6),a0
  3695.     tst.l    d4
  3696.     bpl.w     mulsrf
  3697.     neg.b    4(a0)        
  3698.     bra.w     mulsrf
  3699. 4:      move.b    4(a1),4(a0)
  3700.     tst.l    d4
  3701.     bpl.b     6f
  3702.     neg.b    4(a0)        
  3703. 6:      lea     (a0,d0.w*4),a0 
  3704.     lea     (a1,d0.w*4),a1 
  3705.     subq.w    #3,d0        
  3706.     move.w    d0,d4        
  3707.     move.w    d4,d6
  3708.     moveq    #0,d1        
  3709.     moveq    #0,d0        
  3710. 7:      move.l    -(a1),d5
  3711.     mulu.l    d2,d3:d5
  3712.     add.l    d0,d5
  3713.     addx.l    d1,d3
  3714.     move.l    d5,-(a0)
  3715.     move.l    d3,d0        
  3716.     dbra    d6,7b
  3717.     bfffo    d0{0:32},d1    
  3718.     lsl.l    d1,d0        
  3719.     moveq    #1,d6
  3720.     lsl.l    d1,d6
  3721.     subq.l    #1,d6        
  3722.     neg.b    d1
  3723.     add.b    #32,d1
  3724. 8:      move.l    (a0),d2
  3725.     ror.l    d1,d2
  3726.     move.l    d2,d3
  3727.     and.l    d6,d3
  3728.     sub.l    d3,d2
  3729.     add.l    d3,d0
  3730.     move.l    d0,(a0)+
  3731.     move.l    d2,d0
  3732.     dbra    d4,8b
  3733.     move.l    -4(a6),a0    
  3734.     move.l    -4(a1),d0
  3735.     and.l    #0xffffff,d0    
  3736.     add.l    d1,d0        
  3737.     btst    #24,d0
  3738.     beq.b     9f
  3739.     L1108:     move.l    #18,-(sp)
  3740.     jsr     _err
  3741. 9:      move.w    d0,6(a0)    
  3742.     swap    d0
  3743.     move.b    d0,5(a0)
  3744. mulsrf:  move.l    -4(a6),d0    
  3745. mulsrf1: movem.l    (sp)+,d2-d6/a2
  3746.     unlk    a6
  3747.     rts
  3748.     
  3749. *===================================================================*
  3750. *                                    *
  3751. *        Multiplication : entier * entier = entier        *
  3752. *                                    *
  3753. *    entree : a7(4) pointe sur i2 de type I             *
  3754. *         a7(8) pointe sur i1 de type I             *
  3755. *    sortie : d0 pointe sur i2 * i1 de type I (zone creee)    *
  3756. *                                    *
  3757. *===================================================================*
  3758.  
  3759. _mulii:  link    a6,#0
  3760.     movem.l    d2-d7/a2-a4,-(sp)
  3761.     move.l    8(a6),a1
  3762.     move.l    12(a6),a2    
  3763.     move.w    6(a1),d1    
  3764.     move.w    6(a2),d2    
  3765.     cmp.w    d1,d2
  3766.     bcc.b     1f
  3767.     exg     a1,a2
  3768.     exg     d1,d2        
  3769. 1:      subq.w    #2,d1        
  3770.     bne.b     2f
  3771. 6:      move.l    _gzero,d0
  3772.     bra.w     muliig
  3773. 2:      move.w    d2,d0        
  3774.     add.w    d1,d0        
  3775.     bvc.b     3f
  3776.     move.l    #17,-(sp)
  3777.     jsr     _err        
  3778.     bra.b     6b
  3779. 3:      bsr     _geti        
  3780.     move.w    d0,6(a0)    
  3781.     move.b    4(a1),d3
  3782.     move.b    4(a2),d4
  3783.     eor.b    d4,d3
  3784.     addq.b    #1,d3
  3785.     move.b    d3,4(a0)    
  3786.     lea     (a0,d0.w*4),a4 
  3787.     lea     (8,a1,d1.w*4),a1 
  3788.     lea     (a2,d2.w*4),a3 
  3789.     subq.w    #1,d1        
  3790.     subq.w    #3,d2        
  3791.     move.w    d2,d0        
  3792.     moveq    #0,d7        
  3793. *; x=x1x2...xn multiplicande (x=i2,n=L2) pointe par a2 et a3 *
  3794. *; y=y1...ym multiplicateur (y=i1,m=L1) pointe par a1 *
  3795. *; z=z1z2...z(n+m) resultat pointe par a0 et a4 *
  3796. *; a0 et a2 sont decrementes par la boucle interne (les valeurs initiales *
  3797. *; etant conservees dans a4 et a3)  *
  3798. *...................................................................*
  3799.     move.l    a3,a2        
  3800.     move.l    a4,a0        
  3801.     move.l    -(a1),d3     
  3802.     sub.l    d4,d4
  3803. m1:      move.l    d4,d6
  3804.     move.l    d3,d5
  3805.     mulu.l    -(a2),d4:d5    
  3806.     addx.l    d5,d6
  3807.     addx.l    d7,d4        
  3808.     move.l    d6,-(a0)     
  3809.     dbra    d2,m1        
  3810.     bra.b     bclf        
  3811. mext:     subq.l    #4,a4        
  3812.     move.l    a3,a2        
  3813.     move.l    a4,a0        
  3814.     move.l    d0,d2        
  3815.     move.l    -(a1),d3     
  3816.     sub.l    d4,d4
  3817. mint:      move.l    d4,d6
  3818.     move.l    d3,d5
  3819.     mulu.l    -(a2),d4:d5    
  3820.     addx.l    d5,d6
  3821.     addx.l    d7,d4        
  3822.     add.l    d6,-(a0)     
  3823.     dbra    d2,mint
  3824.     addx.l    d7,d4
  3825. bclf:     move.l    d4,-(a0)     
  3826.     dbra    d1,mext     
  3827. *...................................................................*
  3828.     beq.b     4f
  3829.     subq.l    #8,a0        
  3830.     bra.b     muliif
  3831. 4:      subq.w    #1,-2(a0)
  3832.     subq.w    #1,-6(a0)    
  3833.     move.l    -4(a0),(a0)     
  3834.     move.l    -8(a0),-(a0)    
  3835.     add.l    #4,_avma
  3836. muliif:  move.l    a0,d0
  3837. muliig:    movem.l    (sp)+,d2-d7/a2-a4
  3838.     unlk    a6
  3839.     rts
  3840.  
  3841. *===================================================================*
  3842. *                                    *
  3843. *        Multiplication : reel * reel = reel         *
  3844. *                                    *
  3845. *    entree : a7(4) pointe sur r2 de type R             *
  3846. *         a7(8) pointe sur r1 de type R             *
  3847. *    sortie : d0 pointe sur r2 * r1 de type R (zone creee)    *
  3848. *                                    *
  3849. *    precision : L = inf ( L1 , L2 )                 *
  3850. *                                    *
  3851. *===================================================================*
  3852.  
  3853. _mulrr: link    a6,#-20
  3854.     movem.l    d2-d7/a2-a4,-(sp)
  3855.     move.l    8(a6),a1    
  3856.     move.l    12(a6),a2    
  3857.     move.b    4(a1),d0
  3858.     and.b    4(a2),d0
  3859.     bne.b     munzr
  3860. muzr:     moveq    #3,d0
  3861.     bsr     _getr
  3862.     move.l    a0,-8(a6)
  3863.     move.l    4(a1),d1
  3864.     and.l    #0xffffff,d1    
  3865.     move.l    4(a2),d2    
  3866.     and.l    #0xffffff,d2    
  3867.     add.l    d2,d1
  3868.     sub.l    #0x800000,d1
  3869.     cmp.l    #0x1000000,d1
  3870.     bcs.b     1f
  3871.     move.l    #20,-(sp)    
  3872.     jsr     _err
  3873. 1:      tst.l    d1
  3874.     bgt.b     2f
  3875.     move.l    #21,-(sp)    
  3876.     jsr     _err
  3877. 2:      move.l    d1,4(a0)
  3878.     clr.l    8(a0)
  3879.     bra.b     mulrrf
  3880. munzr:    move.w    2(a2),d0
  3881.     clr.l    -12(a6)
  3882.     cmp.w    2(a1),d0
  3883.     bls.b     1f
  3884.     move.w    2(a1),d0    
  3885.     exg     a1,a2
  3886.     bra.b    2f
  3887. 1:    bne.b    2f
  3888.     lea     (a1,d0.w*4),a3
  3889.     move.l    a3,-12(a6)
  3890.     move.l    (a3),-16(a6)
  3891.     clr.l    (a3)
  3892. 2:      bsr     _getr
  3893.     move.l    a0,-8(a6)
  3894.     bsr     murr
  3895.     tst.l    -12(a6)
  3896.     beq.b    mulrrf
  3897.     move.l    -12(a6),a1
  3898.     move.l    -16(a6),(a1)
  3899. mulrrf: move.l    -8(a6),d0    
  3900.     movem.l    (sp)+,d2-d7/a2-a4
  3901.     unlk    a6
  3902.     rts
  3903.  
  3904. *-------------------------------------------------------------------*
  3905. *    module interne de multiplication r0=r1*r2            *
  3906. *        ( pour R*R et I*R)                    *
  3907. *    entree : a1 et a2 pointent sur 2 reels            *
  3908. *    r1,r2  non nuls avec L1>=L2=m                *
  3909. *         a0 pointe sur une zone reelle de long l1        *
  3910. *    sortie : le produit r0 est mis a l'addresse a0              *
  3911. *                                    *
  3912. *-------------------------------------------------------------------*
  3913.  
  3914. *; notation : r1 = x = x1x2...xmx(m+1)...  multiplicande *
  3915. * ;         r2 = y = y1y2...ym       multiplicateur *
  3916. * ;    ( le lgmot x(m+1) peut ne pas exister ! ( le1 >= le2 = m ) ) *
  3917. * ;          z = z0z1z2...zmz(m+1) resultat. *
  3918. * ;    ( z0=0 ou 1 et z(m+1) a jeter) *
  3919. *    move.w    2(a2),d0 doit avoir ete fait avant l'appel *
  3920.  
  3921. murr:     move.l    a1,a3
  3922.     lea     12(a3),a3    
  3923.     lea     (a2,d0.w*4),a2 
  3924.     lea     (a0,d0.w*4),a0 
  3925.     move.l    (a0),-4(a6)     
  3926.     clr.l    (a0)+        
  3927.     subq.w    #3,d0
  3928.     move.l    d0,-20(a6)    
  3929.     clr.w    d3        
  3930. *...................................................................*
  3931. bext:     move.l    a0,a4        
  3932.     move.l    a3,a1        
  3933.     move.w    d3,d2        
  3934.     move.l    -(a2),d4     
  3935.     move.l    (a3)+,d5
  3936.     sub.l    d1,d1 
  3937.     mulu.l    d4,d7:d5
  3938. bint:    move.l    d7,d6
  3939.     move.l    d4,d5
  3940.     mulu.l    -(a1),d7:d5
  3941.     addx.l    d5,d6
  3942.     addx.l    d1,d7
  3943.     add.l    d6,-(a4)
  3944.     dbra    d2,bint
  3945.     addx.l    d1,d7
  3946.     move.l    d7,-(a4)     
  3947.     addq.w    #1,d3        
  3948.     dbra    d0,bext     
  3949. *...................................................................*
  3950.     move.l    -4(a1),d1    
  3951.     and.l    #0xffffff,d1    
  3952.     move.l    -4(a2),d2    
  3953.     and.l    #0xffffff,d2
  3954.     add.l    d2,d1
  3955.     sub.l    #0x800000,d1
  3956.     tst.l    (a4)         
  3957.     bpl.b     1f
  3958.     add.l    #1,d1        
  3959.     bra.b     2f
  3960. 1:      move.l    a0,a4        
  3961.     subq.w    #2,a4
  3962.     move.l    -20(a6),d0
  3963.     roxl.w    -(a4)        
  3964. 5:      roxl.w    -(a4)        
  3965.     roxl.w    -(a4)
  3966.     dbra    d0,5b
  3967. 2:      cmp.l    #0x1000000,d1
  3968.     bcs.b     3f
  3969.     move.l    #20,-(sp)    
  3970.     jsr     _err
  3971. 3:      tst.l    d1
  3972.     bgt.b     4f
  3973.     move.l    #21,-(sp)    
  3974.     jsr     _err
  3975. 4:      move.l    d1,-(a4)     
  3976.     move.b    -4(a1),d1
  3977.     move.b    -4(a2),d2    
  3978.     eor.b    d2,d1
  3979.     addq.b    #1,d1
  3980.     move.b    d1,(a4)        
  3981.     move.l    -4(a6),-4(a0) 
  3982. murrf:     rts
  3983.  
  3984. *===================================================================*
  3985. *                                    *
  3986. *        Multiplication : entier * reel = reel        *
  3987. *                                    *
  3988. *    entree : a7(4) pointe sur i2 de type I             *
  3989. *         a7(8) pointe sur r1 de type R             *
  3990. *    sortie : d0 pointeur sur i2 * r1 de type R (zone creee)     *
  3991. *                                    *
  3992. *===================================================================*
  3993.  
  3994. _mulir:  link    a6,#-20
  3995.     movem.l    d2-d7/a2-a4,-(sp)
  3996.     move.l    8(a6),a2    
  3997.     tst.b    4(a2)
  3998.     bne.b     1f
  3999.     move.l    _gzero,d0
  4000.     bra.w     mulirf1
  4001. 1:      move.l    12(a6),a1    
  4002.     tst.b    4(a1)
  4003.     bne.b     2f
  4004.     moveq    #3,d0
  4005.     bsr     _getr
  4006.     move.w    6(a2),d0
  4007.     lsl.l    #5,d0
  4008.     bfffo    8(a2){0:32},d1
  4009.     sub.l    d1,d0
  4010.     sub.l    #65,d0
  4011.     add.l    4(a1),d0
  4012.     cmp.l    #0x1000000,d0
  4013.     bcs.b     3f
  4014.     move.l    #22,-(sp)    
  4015.     jsr     _err
  4016. 3:      move.l    d0,4(a0)
  4017.     clr.l    8(a0)
  4018.     move.l    a0,d0
  4019.     bra.b     mulirf1
  4020. 2:      move.w    2(a1),d0
  4021.     bsr     _getr        
  4022.     move.l    a0,-8(a6)    
  4023.     addq.w    #1,d0
  4024.     bsr     _getr        
  4025.     move.l    a0,-(a7)
  4026.     move.l    a2,-(a7)
  4027.     bsr     _affir
  4028.     addq.l    #4,sp
  4029.     move.l    (a7),a2        
  4030.     move.l    -8(a6),a0
  4031.     exg    a1,a2
  4032.     move.w    2(a2),d0
  4033.     bsr     murr
  4034.     move.l    (a7)+,a0
  4035.     bsr     _giv
  4036. mulirf: move.l    -8(a6),d0
  4037. mulirf1: movem.l (sp)+,d2-d7/a2-a4
  4038.     unlk    a6
  4039.     rts
  4040.  
  4041.  
  4042.  
  4043.  
  4044.  
  4045. *********************************************************************
  4046. *********************************************************************
  4047. ***                                   ***
  4048. ***         PROGRAMMES DE DIVISION AVEC RESTE          ***
  4049. ***                                   ***
  4050. *********************************************************************
  4051. *********************************************************************
  4052.  
  4053.  
  4054.  
  4055.  
  4056.  
  4057. *===================================================================*
  4058. *                                    *
  4059. *        Division avec reste (par valeur)            *
  4060. *                                    *
  4061. *    entree : a7(4) pointe sur n2 de type I             *
  4062. *         a7(8) pointe sur n1 de type I             *
  4063. *         a7(12) pointe sur n3 de type I            *
  4064. *         a7(16) pointe sur n4 de type I            *
  4065. *    sortie : la zone pointee par a7(12) contient n2 / n1    *
  4066. *         la zone pointee par a7(16) contient le reste (du    *
  4067. *         signe du dividende)                *
  4068. *    interdit : type S et R                    *
  4069. *                                    *
  4070. *===================================================================*
  4071.  
  4072. _mpdvmdz: lea    _dvmdii,a0
  4073.     bra.w     mpopii
  4074.  
  4075.         
  4076. _dvmdssz: lea    _dvmdss,a0
  4077.     bra.w     mpopii
  4078.  
  4079.         
  4080. _dvmdsiz: lea    _dvmdsi,a0
  4081.     bra.w     mpopii
  4082.  
  4083.         
  4084. _dvmdisz: lea    _dvmdis,a0
  4085.     bra.w     mpopii
  4086.  
  4087.         
  4088. _dvmdiiz: lea    _dvmdii,a0
  4089.     bra.w     mpopii
  4090.  
  4091. *===================================================================*
  4092. *                                    *
  4093. *Division avec reste : entier court / entier court =(entier,entier) *
  4094. *                                    *
  4095. *    entree : a7(4) contient s2 de type S            *
  4096. *         a7(8) contient s1 de type S            *
  4097. *    sortie : a7(12) pointe sur l'adresse du futur reste        *
  4098. *         d0 pointe sur s2 div s1 de type I            *
  4099. *         le reste est du signe de s2 (zone creee)        *
  4100. *                                    *
  4101. *===================================================================*
  4102.  
  4103. _dvmdss: link    a6,#0
  4104.     move.l    d2,-(sp)
  4105.     move.l    12(a6),-(sp)    
  4106.     move.l    8(a6),-(sp)     
  4107.     bsr     _divss
  4108. dmd:     addq.l    #8,sp
  4109.     tst.l    d1
  4110.     bne.b     1f
  4111.     move.l    _gzero,a0
  4112.     bra.b     dvmdssf
  4113. 1:      move.l    d0,d2
  4114.     moveq    #3,d0
  4115.     bsr     _geti
  4116.     move.l    #0x1000003,4(a0)
  4117.     tst.l    d1
  4118.     bpl.b     2f
  4119.     neg.l    d1
  4120.     move.b    #-1,4(a0)
  4121. 2:      move.l    d1,8(a0)
  4122.     move.l    d2,d0
  4123. dvmdssf: move.l    16(a6),a1
  4124.     move.l    a0,(a1)
  4125.     move.l    (sp),d2
  4126.     unlk    a6
  4127.     rts
  4128.  
  4129. *===================================================================*
  4130. *                                    *
  4131. *    Division avec reste : entier court / entier = (entier,entier)    *
  4132. *                                    *
  4133. *    entree : a7(4) contient s2 de type S            *
  4134. *         a7(8) pointe sur i1 de type I             *
  4135. *         a7(12) pointe sur l'adresse du futur reste        *
  4136. *    sortie : d0 pointe sur s2 div i1 de type I ;        *
  4137. *         reste du signe de s2 (zones creees)        *
  4138. *                                    *
  4139. *===================================================================*
  4140.  
  4141. _dvmdsi: move.l    8(a7),-(sp)
  4142.     move.l    8(a7),-(sp)
  4143.     bsr     _divsi
  4144. dmdi:     addq.l    #8,sp
  4145.     move.l    d0,a1        
  4146.     tst.l    d1
  4147.     bne.b     1f
  4148.     move.l    _gzero,([12,sp])
  4149.     rts
  4150. 1:      moveq    #3,d0
  4151.     bsr     _geti
  4152.     move.l    #0x1000003,4(a0)
  4153.     tst.l    d1
  4154.     bpl.b     2f
  4155.     neg.l    d1
  4156.     move.b    #-1,4(a0)
  4157. 2:      move.l    d1,8(a0)
  4158. 3:      move.l    a1,d0
  4159.     move.l    a0,([12,sp])
  4160.     rts
  4161.  
  4162. *===================================================================*
  4163. *                                    *
  4164. *    Division avec reste : entier / entier court = (entier,entier)    *
  4165. *                                    *
  4166. *    entree : a7(4) pointe sur i2 de type I             *
  4167. *         a7(8) contient s1 de type S            *
  4168. *         a7(12) pointe sur l'adresse du futur reste        *
  4169. *    sortie : d0 pointe sur i2 div s1 de type I            *
  4170. *         reste de type I du signe de s1 (zones creees)    *
  4171. *                                    *
  4172. *===================================================================*
  4173.  
  4174. _dvmdis: move.l    8(a7),-(sp)
  4175.     move.l    8(a7),-(sp)
  4176.     bsr     _divis
  4177.     bra.b     dmdi
  4178.  
  4179. *===================================================================*
  4180. *                                    *
  4181. *    Division avec reste : entier / entier = (entier,entier)     *
  4182. *                                    *
  4183. *    entree : a7(4) pointe sur i2 de type I (dividende)     *
  4184. *         a7(8) pointe sur i1 de type I (diviseur)        *
  4185. *         a7(12) contient un pointeur sur le reste si l'on  *
  4186. *         veut a la fois q et r, 0 si l'on ne veut que le    *
  4187. *         quotient, -1 si l'on ne veut que le reste          *
  4188. *    sortie : d0 pointe sur q si celui-ci est attendu, et sinon    *
  4189. *         sur r. a7(12) pointe sur r si q et r sont attendus*
  4190. *         (toutes les zones sont creees)             *
  4191. *    remarque : il s'agit de la 'fausse division' ; le reste est *
  4192. *          du signe du dividende                 *
  4193. *                                    *
  4194. *                                    *
  4195. *    variable.bs locales (etat pile apres link):            *
  4196. *  -16 -14 -12 -10 -8  -6    -4      a6    4     8      12   16        *
  4197. *  +---+---+---+---+---+---+------+----+----+----+----+----+    *
  4198. *    n-m  k sgnq sgnr n     m    ad(q,r)      ret  i2   i1 ^r/0/-1    *
  4199. *                                    *
  4200. *===================================================================*
  4201.  
  4202. _dvmdii: link    a6,#-32
  4203.     movem.l    d2-d7/a2-a4,-(sp)
  4204.     move.l    12(a6),a1    
  4205.     move.w    6(a1),d1    
  4206.     cmp.w    #2,d1
  4207.     bne.b     dv1
  4208.     move.l    #36,-(sp)
  4209. dvmerr:  jsr     _err
  4210.     dv1:     move.l    8(a6),a2    
  4211.     move.w    6(a2),d2    
  4212.     cmp.w    #2,d2
  4213.     bne.b     dv3
  4214.     dv2:     move.l    16(a6),d3
  4215.     cmp.l    #-1,d3
  4216.     beq.b     1f
  4217.     move.l    _gzero,d0
  4218. 1:      tst.l    d3
  4219.     beq.w     dvmiif
  4220.     move.l    _gzero,a0
  4221.     btst    #0,d3        
  4222.     bne.b     2f
  4223.     move.l    d3,a1        
  4224.     move.l    a0,(a1)
  4225.     bra.w     dvmiif
  4226. 2:      move.l    a0,d0
  4227.     bra.w     dvmiif
  4228.     dv3:     move.w    d2,d0        
  4229.     sub.w    d1,d0        
  4230.     bcc.b     dv4
  4231.     move.l    16(a6),d3
  4232.     cmp.l    #-1,d3
  4233.     beq.b     1f
  4234.     move.l    _gzero,d0
  4235. 1:      tst.l    d3
  4236.     beq.w     dvmiif
  4237.     move.l    d0,d1
  4238.     move.w    d2,d0
  4239.     bsr     _geti
  4240.     move.l    a0,a1
  4241.     subq.w    #2,d0
  4242.     addq.l    #4,a0
  4243.     addq.l    #4,a2
  4244. 2:      move.l    (a2)+,(a0)+
  4245.     dbra    d0,2b
  4246.     cmp.l    #-1,d3
  4247.     beq.b     3f
  4248.     move.l    d3,a0
  4249.     move.l    a1,(a0)
  4250.     move.l    d1,d0
  4251.     bra.w     dvmiif
  4252. 3:      move.l    a1,d0
  4253.     bra.w     dvmiif
  4254.     dv4:     move.b    4(a1),d3    
  4255.     move.b    4(a2),d4    
  4256.     eor.b    d4,d3
  4257.     addq.b    #1,d3        
  4258.     move.b    d3,-12(a6)     
  4259.     move.b    d4,-10(a6)     
  4260.     move.l    _avma,-20(a6)    
  4261.     move.w    d2,d0        
  4262.     bsr     _geti        
  4263.     move.l    a0,-4(a6)    
  4264.     subq.w    #2,d1
  4265.     subq.w    #2,d2
  4266.     move.w    d1,-6(a6)    
  4267.     move.w    d2,-8(a6)    
  4268.     move.w    d2,-16(a6)
  4269.     sub.w    d1,-16(a6)     
  4270.     addq.l    #8,a2
  4271.     addq.l    #8,a1
  4272.     move.l    (a1),d3        
  4273.     subq.w    #1,d2        
  4274.     subq.w    #1,d1        
  4275.     bne.b     divlon
  4276.     divsim:  clr.l    d4
  4277. 1:      move.l    (a2)+,d5
  4278.     divu.l    d3,d4:d5
  4279.     move.l    d5,(a0)+
  4280.     dbra    d2,1b
  4281.     move.l    d4,(a0)        
  4282.     move.l    a0,a2        
  4283.     clr.w    -14(a6)    
  4284.     bra.w     ranger
  4285. divlon: bfffo    d3{0:32},d4    
  4286.     move.w    d4,-14(a6)     
  4287.     bne.b     1f
  4288.     move.l    a0,a4
  4289.     move.l    #0,(a4)+     
  4290. 4:      move.l    (a2)+,(a4)+    
  4291.     dbra    d2,4b
  4292.     move.l    a0,a2        
  4293.     lea     (4,a1,d1.w*4),a3 
  4294.     bra.b     nosh
  4295. 1:      lsl.l    d4,d3        
  4296.     move.w    -6(a6),d0    
  4297.     bsr     _geti        
  4298.     moveq    #1,d6
  4299.     lsl.l    d4,d6
  4300.     subq.l    #1,d6        
  4301.     move.l    a0,a3
  4302.     subq.w    #1,d0        
  4303.     addq.l    #4,a1        
  4304.     bra.b     3f
  4305. 2:      move.l    (a1)+,d1     
  4306.     rol.l    d4,d1
  4307.     move.l    d1,d5
  4308.     and.l    d6,d1
  4309.     add.l    d1,d3
  4310.     move.l    d3,(a3)+
  4311.     sub.l    d1,d5
  4312.     move.l    d5,d3
  4313. 3:      dbra    d0,2b
  4314.     move.l    d3,(a3)+
  4315.     move.l    a0,a1        
  4316.     move.l    -4(a6),a4    
  4317.     moveq    #0,d3
  4318.     move.w    -8(a6),d0
  4319.     subq.w    #1,d0        
  4320. 5:      move.l    (a2)+,d1     
  4321.     rol.l    d4,d1        
  4322.     move.l    d1,d5        
  4323.     and.l    d6,d1
  4324.     add.l    d1,d3
  4325.     move.l    d3,(a4)+
  4326.     sub.l    d1,d5
  4327.     move.l    d5,d3
  4328.     dbra    d0,5b
  4329.     move.l    d3,(a4)
  4330.     move.l    -4(a6),a2    
  4331. nosh:     move.w    -6(a6),d6    
  4332.     lea     (4,a2,d6.w*4),a4 
  4333.     subq.w    #1,d6        
  4334.     move.w    -16(a6),d7     
  4335. *-------------------------------------------------------------------*
  4336.         
  4337. bclext:  move.l    (a1),d0        
  4338.     cmp.l    (a2),d0        
  4339.     bne.b     1f
  4340.     moveq    #-1,d1        
  4341.     add.l    4(a2),d0    
  4342.     bcs.b     4f        
  4343.     move.l    d0,d2        
  4344.     bra.b     2f
  4345. 1:      move.l    (a2),d2        
  4346.     move.l    4(a2),d1    
  4347.     divu.l    d0,d2:d1    
  4348. 2:      move.l    4(a1),d3    
  4349.     mulu.l    d1,d4:d3    
  4350.     sub.l    8(a2),d3
  4351.     subx.l    d2,d4        
  4352.     bls.b     4f        
  4353. 3:      subq.l    #1,d1        
  4354.     sub.l    4(a1),d3    
  4355.     subx.l    d0,d4        
  4356.     bhi.b     3b        
  4357. 4:      move.w    d6,d0        
  4358.     move.l    a3,a1        
  4359.     move.l    a4,a2        
  4360.     moveq    #0,d2        
  4361.     sub.l    d3,d3
  4362. 5:      move.l    -(a1),d5     
  4363.     mulu.l    d1,d4:d5
  4364.     addx.l    d3,d5
  4365.     addx.l    d2,d4
  4366.     sub.l    d5,-(a2)     
  4367.     move.l    d4,d3
  4368.     dbra    d0,5b
  4369.     addx.l    d2,d3
  4370.     sub.l    d3,-4(a2)    
  4371.     bcc.b     6f        
  4372.     subq.l    #1,d1        
  4373.     move.w    d6,d0        
  4374.     move.l    a3,a1
  4375.     move.l    a4,a2        
  4376. 7:      addx.l    -(a1),-(a2)
  4377.     dbra    d0,7b
  4378. 6:      move.l    d1,-4(a2)    
  4379.     addq.l    #4,a4        
  4380.     dbra    d7,bclext    
  4381. *-------------------------------------------------------------------*
  4382.     
  4383. ranger:  clr.l    -28(a6)
  4384.     clr.l    -32(a6)
  4385.     move.l    _avma,-24(a6)    
  4386.     move.l    -20(a6),d7     
  4387.     sub.l    _avma,d7    
  4388.     move.l    16(a6),d3
  4389.     cmp.l    #-1,d3
  4390.     beq.b     rngres
  4391.     move.l    -4(a6),a0    
  4392.     move.w    -16(a6),d0     
  4393.     move.w    d0,d1
  4394.     addq.w    #2,d0
  4395.     tst.l    (a0)
  4396.     beq.b     1f
  4397.     addq.w    #1,d0
  4398. 1:      bsr     _geti        
  4399.     move.l    a0,-28(a6)     
  4400.     add.l    d7,-28(a6)     
  4401.     lea     (a0,d0.w*4),a1 
  4402.     move.l    a2,a3        
  4403. 2:      move.l    -(a3),-(a1)    
  4404.     dbra    d1,2b
  4405.     move.w    d0,6(a0)    
  4406.     move.b    -12(a6),4(a0) 
  4407.     cmp.w    #2,d0
  4408.     bne.b     rngres
  4409.     clr.b    4(a0)        
  4410. rngres:  tst.l    d3
  4411.     beq.b     rendre
  4412.     move.w    -6(a6),d0
  4413.     subq.w    #1,d0        
  4414. 4:      tst.l    (a2)+
  4415.     dbne    d0,4b
  4416.     bne.b     1f
  4417.     move.w    #2,d0
  4418.     bsr     _geti
  4419.     move.l    #2,4(a0)
  4420.     add.l    d7,a0        
  4421.     move.l    a0,-32(a6)     
  4422.     bra.b     rendre
  4423. 1:      subq.l    #4,a2        
  4424.     move.w    d0,d1
  4425.     addq.w    #3,d0
  4426.     bsr     _geti        
  4427.     move.l    a0,-32(a6)
  4428.     add.l    d7,-32(a6)     
  4429.     move.b    -10(a6),4(a0) 
  4430.     move.w    d0,6(a0)    
  4431.     addq.l    #8,a0
  4432.     move.w    -14(a6),d3     
  4433.     bne.b     2f
  4434. 5:      move.l    (a2)+,(a0)+
  4435.     dbra    d1,5b
  4436.     bra.b     rendre
  4437. 2:      moveq    #-1,d6        
  4438.     lsr.l    d3,d6        
  4439.     moveq    #0,d5
  4440.     bset    d3,d5        
  4441.     moveq    #0,d2
  4442.     cmp.l    (a2),d5        
  4443.     bls.b     3f
  4444.     move.l    (a2)+,d2     
  4445.     ror.l    d3,d2
  4446.     subq.w    #1,d0        
  4447.     subq.w    #1,-2(a0)    
  4448. 3:      move.l    (a2)+,d5     
  4449.     ror.l    d3,d5        
  4450.     move.l    d5,d4
  4451.     and.l    d6,d4
  4452.     add.l    d4,d2
  4453.     move.l    d2,(a0)+
  4454.     sub.l    d4,d5
  4455.     move.l    d5,d2
  4456.     dbra    d1,3b
  4457. rendre:  move.l    -20(a6),a0     
  4458.     move.l    -24(a6),a1     
  4459.     move.l    a1,d0
  4460.     sub.l    _avma,d0
  4461.     lsr.l    #2,d0        
  4462.     subq.w    #1,d0
  4463. 1:      move.l    -(a1),-(a0)
  4464.     dbra    d0,1b
  4465.     move.l    a0,_avma        
  4466.     move.l    -28(a6),d0
  4467.     bne.b     2f
  4468.     move.l    -32(a6),d0
  4469.     bra.b     dvmiif
  4470. 2:      tst.l    -32(a6)
  4471.     beq.b     dvmiif
  4472.     move.l    16(a6),a1
  4473.     move.l    -32(a6),(a1)
  4474. dvmiif: movem.l (sp)+,d2-d7/a2-a4
  4475.     unlk    a6
  4476.     rts
  4477.  
  4478.  
  4479.  
  4480. *===================================================================*
  4481. *                                    *
  4482. *            Divisibilite de i2 par i1            *
  4483. *                                    *
  4484. *    entree : a7(4) pointe sur n2 de type I             *
  4485. *         a7(8) pointe sur n1 de type I             *
  4486. *         a7(12) contient un pointeur ( pour quotient )     *
  4487. *    sortie : d0 contient 1 si n1 divise n2            *
  4488. *                 0 sinon
  4489. *    a7(12) pointe sur n2 / n1 de type I  (zone creee)        *
  4490. *    lorsque n1 divise n2,  sinon n'est pas affecte.             *
  4491. *                                    *
  4492. *===================================================================*
  4493.  
  4494. _mpdivis: link a6,#-8
  4495.     move.l    _avma,-8(a6)
  4496.     pea     -4(a6)
  4497.     move.l    12(a6),-(sp)
  4498.     move.l    8(a6),-(sp)
  4499.     bsr     _dvmdii
  4500.     lea     12(sp),sp
  4501.     tst.b    ([-4,a6],4)         
  4502.     beq.b     1f
  4503.     moveq    #0,d0
  4504.     move.l    -8(a6),_avma        
  4505.     bra.b     2f
  4506. 1:      move.l    16(a6),-(sp)
  4507.     move.l    d0,-(sp)         
  4508.     bsr     _affii
  4509.     moveq    #1,d0
  4510.     move.l    -8(a6),_avma
  4511. 2:      unlk    a6
  4512.     rts
  4513.  
  4514.  
  4515. *===================================================================*
  4516. *                                    *
  4517. *        Flag de divisibilite de i2 par i1            *
  4518. *                                    *
  4519. *    entree : a7(4) pointe sur n2 de type I             *
  4520. *         a7(8) pointe sur n1 de type I             *
  4521. *    sortie : d0 contient 1 si n1 divise n2            *
  4522. *                 0 sinon                *
  4523. *                                    *
  4524. *===================================================================*
  4525.  
  4526. _divise:  move.l    #-1,-(sp)
  4527.     move.l    12(sp),-(sp)
  4528.     move.l    12(sp),-(sp)
  4529.     bsr     _dvmdii
  4530.     lea     12(sp),sp
  4531.     move.l    d0,a0
  4532.     moveq    #1,d0
  4533.     tst.b    4(a0)
  4534.     beq.w     _giv
  4535.     moveq    #0,d0
  4536.     bra.w     _giv
  4537.  
  4538.  
  4539.  
  4540.  
  4541. *********************************************************************
  4542. *********************************************************************
  4543. ***                                   ***
  4544. ***             PROGRAMMES DE DIVISION              ***
  4545. ***                                   ***
  4546. *********************************************************************
  4547. *********************************************************************
  4548.  
  4549.  
  4550.  
  4551.  
  4552.  
  4553. *===================================================================*
  4554. *                                    *
  4555. *            Division generale                *
  4556. *                                    *
  4557. *    entree : a7(4) pointe sur n2 de type I ou R        *
  4558. *         a7(8) pointe sur n1 de type I ou R        *
  4559. *    sortie : d0 pointe sur n2 / n1 de type I ou R (zone creee)    *
  4560. *         Le reste est du signe du dividende         *
  4561. *    interdit : type S                        *
  4562. *    precision : voir routines specialisees            *
  4563. *                                    *
  4564. *===================================================================*
  4565.  
  4566. _mpdiv:  cmp.b    #1,([8,sp])
  4567.     bne.b     1f
  4568.     cmp.b    #1,([4,sp])
  4569.     beq.w     _divii
  4570.     bra.w     _divri
  4571. 1:      cmp.b    #1,([4,sp])
  4572.     beq.w     _divir
  4573.     bra.w     _divrr
  4574.  
  4575. *===================================================================*
  4576. *                                    *
  4577. *            Division (par valeur)            *
  4578. *                                    *
  4579. *    entree : a7(4) pointe sur n2 de type I ou R        *
  4580. *         a7(8) pointe sur n1 de type I ou R        *
  4581. *         a7(12) pointe sur n3 de type I ou R        *
  4582. *    sortie : la zone pointee par a7(12) contient n2 / n1 de    *
  4583. *         type le type de n3                 *
  4584. *    interdit : type S ainsi que les divisions suivantes :    *
  4585. *         R/I=I , I/R=I ,R/R=I                *
  4586. *                                    *
  4587. *===================================================================*
  4588.  
  4589. _mpdivz: move.l    a2,-(sp)
  4590.     move.l    _avma,-(sp)
  4591.     move.l    12(sp),a1
  4592.     move.l    16(sp),a0
  4593.     move.l    20(sp),a2    
  4594.     cmp.b    #1,(a2)
  4595.     bne.b     1f
  4596.     cmp.b    #1,(a1)
  4597.     beq.b     2f
  4598. 3:      move.l    #35,-(sp)
  4599.     jsr     _err
  4600. 2:      cmp.b    #1,(a0)
  4601.     bne.b     3b
  4602.     move.l    a0,-(sp)
  4603.     move.l    a1,-(sp)
  4604.     bsr     _divii
  4605.     move.l    a2,4(sp)
  4606.     move.l    d0,(sp)
  4607.     bsr     _affii
  4608.     addq.l    #8,sp
  4609.     bra.b     divzf
  4610. 1:      move.l    a0,-(sp)
  4611.     cmp.b    #1,(a0)
  4612.     beq.b     4f
  4613.     move.l    a1,-(sp)
  4614.     cmp.b    #1,(a1)
  4615.     beq.b     5f
  4616.     bsr     _divrr
  4617.     bra.b     6f
  4618. 5:      bsr     _divir
  4619.     bra.b     6f
  4620. 4:      cmp.b    #1,(a1)
  4621.     beq.b     7f
  4622.     move.l    a1,-(sp)
  4623.     bsr     _divri
  4624.     bra.b     6f
  4625. 7:      move.w    6(a1),d0
  4626.     addq.w    #1,d0
  4627.     bsr     _getr
  4628.     move.l    a0,-(sp)
  4629.     move.l    a1,-(sp)
  4630.     bsr     _affir
  4631.     move.l    4(sp),(sp)
  4632.     move.l    a0,4(sp)
  4633.     bsr     _divrr
  4634. 6:      move.l    a2,4(sp)
  4635.     move.l    d0,(sp)
  4636.     bsr     _affrr
  4637.     addq.l    #8,sp
  4638. divzf:     move.l    (sp)+,_avma
  4639.     move.l    (sp)+,a2
  4640.     rts
  4641.  
  4642.     
  4643. _divsrz: lea     _divsr,a0
  4644.     bra.w     mpopz
  4645.  
  4646.     
  4647. _divrsz: lea     _divrs,a0
  4648.     bra.w     mpopz
  4649.  
  4650.     
  4651. _divirz: lea     _divir,a0
  4652.     bra.w     mpopz
  4653.  
  4654.     
  4655. _divriz: lea     _divri,a0
  4656.     bra.w     mpopz
  4657.  
  4658.     
  4659. _divrrz: lea     _divrr,a0
  4660.     bra.w     mpopz
  4661. *===================================================================*
  4662. *                                    *
  4663. *    Division par valeur : entier / entier = entier ou reel    *
  4664. *                                    *
  4665. *    entree : a7(4) contient i2 de type S            *
  4666. *         a7(8) contient i1 de type S            *
  4667. *         a7(12) pointe sur i3 ou r3 de type I ou R     *
  4668. *    sortie : a7(12) pointe sur i2 / i1 de type I ou R        *
  4669. *                                    *
  4670. *===================================================================*
  4671.  
  4672. _divssz: cmp.b    #1,([12,sp])
  4673.     bne.b     _divssr
  4674. _divssi:  move.l    8(sp),-(sp)
  4675.     move.l    8(sp),-(sp)
  4676.     bsr     _divss
  4677.     move.l    20(sp),4(sp)
  4678.     move.l    d0,(sp)
  4679.     bsr     _affii
  4680.     move.l    (sp),a0
  4681.     addq.l    #8,sp
  4682.     bra.w     _giv
  4683. _divssr:  move.l    _avma,-(sp)
  4684.     move.w    ([16,sp],2),d0
  4685.     bsr     _getr
  4686.     move.l    a0,-(sp)
  4687.     move.l    12(sp),-(sp)
  4688.     bsr     _affsr        
  4689.     move.l    4(sp),(sp)    
  4690.     move.l    20(sp),4(sp)    
  4691.     bsr     _divrs
  4692.     move.l    24(sp),4(sp)
  4693.     move.l    d0,(sp)
  4694.     bsr     _affrr
  4695.     addq.l    #8,sp
  4696.     move.l    (sp)+,_avma
  4697.     rts
  4698.  
  4699. *===================================================================*
  4700. *                                    *
  4701. *    Division par valeur : S / I = entier ou reel        *
  4702. *                                    *
  4703. *    entree : a7(4) contien i2 de type S            *
  4704. *         a7(8) pointe sur i1 de type I             *
  4705. *         a7(12) pointe sur i3 ou r3 de type I ou R     *
  4706. *    sortie : a7(12) pointe sur i2 / i1 de type I ou R        *
  4707. *                                    *
  4708. *===================================================================*
  4709.  
  4710. _divsiz: link    a6,#0
  4711.     movem.l    a2-a4,-(sp)
  4712.     move.l    16(a6),a3
  4713.     cmp.b    #1,(a3)
  4714.     bne.b     _divsir
  4715. _divsii:  move.l    12(a6),-(sp)
  4716.     move.l    8(a6),-(sp)
  4717.     bsr     _divsi
  4718.     move.l    16(a6),4(sp)
  4719.     move.l    d0,(sp)
  4720.     bsr     _affii
  4721.     move.l    (sp),a0
  4722.     addq.l    #8,sp
  4723.     bsr     _giv
  4724. divsizf: movem.l    (sp)+,a2-a4
  4725.     unlk    a6
  4726.     rts
  4727. _divsir:  move.l    _avma,a2
  4728.     move.w    2(a3),d0
  4729.     addq.w    #1,d0
  4730.     bsr     _getr
  4731.     move.l    a0,a4
  4732.     move.l    a0,-(sp)
  4733.     move.l    8(a6),-(sp)
  4734.     bsr     _affsr        
  4735.     addq.l    #2,d0
  4736.     bsr     _getr
  4737.     move.l    a0,4(sp)
  4738.     move.l    12(a6),(sp)
  4739.     bsr     _affir        
  4740.     move.l    a4,(sp)
  4741.     bsr     _divrr
  4742.     move.l    a3,4(sp)
  4743.     move.l    d0,(sp)
  4744.     bsr     _affrr
  4745.     addq.l    #8,sp
  4746.     move.l    a2,_avma
  4747.     bra.b     divsizf
  4748.  
  4749. *===================================================================*
  4750. *                                    *
  4751. *    Division par valeur : I / S = entier ou reel        *
  4752. *                                    *
  4753. *    entree : a7(4) pointe sur i2 de type I             *
  4754. *         a7(8) contient i1 de type S            *
  4755. *         a7(12) pointe sur i3 ou r3 de type I ou R     *
  4756. *    sortie : a7(12) pointe sur i2 / i1 de type I ou R        *
  4757. *                                    *
  4758. *===================================================================*
  4759.  
  4760. _divisz: cmp.b    #1,([12,sp])
  4761.     bne.b     _divisr
  4762. _divisi:  move.l    8(sp),-(sp)
  4763.     move.l    8(sp),-(sp)
  4764.     bsr     _divis
  4765.     move.l    20(sp),4(sp)
  4766.     move.l    d0,(sp)
  4767.     bsr     _affii
  4768.     move.l    (sp),a0
  4769.     addq.l    #8,sp
  4770.     bra.w     _giv
  4771. _divisr:  move.l    _avma,-(sp)
  4772.     move.w    ([16,sp],2),d0
  4773.     bsr     _getr
  4774.     move.l    a0,-(sp)
  4775.     move.l    12(sp),-(sp)
  4776.     bsr     _affir        
  4777.     move.l    4(sp),(sp)    
  4778.     move.l    20(sp),4(sp)    
  4779.     bsr     _divrs
  4780.     move.l    24(sp),4(sp)
  4781.     move.l    d0,(sp)
  4782.     bsr     _affrr
  4783.     addq.l    #8,sp
  4784.     move.l    (sp)+,_avma
  4785.     rts
  4786.  
  4787. *===================================================================*
  4788. *                                    *
  4789. *    Division par valeur : entier / entier = entier ou reel    *
  4790. *                                    *
  4791. *    entree : a7(4) pointe sur i2 de type I             *
  4792. *         a7(8) pointe sur i1 de type I             *
  4793. *         a7(12) pointe sur i3 ou r3 de type I ou R     *
  4794. *    sortie : a7(12) pointe sur i2 / i1 de type I ou R        *
  4795. *                                    *
  4796. *===================================================================*
  4797.  
  4798. _diviiz: link    a6,#0
  4799.     movem.l    a2-a4,-(sp)
  4800.     move.l    16(a6),a3
  4801.     cmp.b    #1,(a3)
  4802.     bne.b     _diviir
  4803. _diviii:  move.l    12(a6),-(sp)
  4804.     move.l    8(a6),-(sp)
  4805.     bsr     _divii
  4806.     move.l    16(a6),4(sp)
  4807.     move.l    d0,(sp)
  4808.     bsr     _affii
  4809.     move.l    (sp),a0
  4810.     addq.l    #8,sp
  4811.     bsr     _giv
  4812. diviizf: movem.l    (sp)+,a2-a4
  4813.     unlk    a6
  4814.     rts
  4815. _diviir:  move.l    _avma,a2
  4816.     move.w    2(a3),d0
  4817.     bsr     _getr
  4818.     move.l    a0,a4
  4819.     move.l    a0,-(sp)
  4820.     move.l    8(a6),-(sp)
  4821.     bsr     _affir        
  4822.     addq.l    #2,d0
  4823.     bsr     _getr
  4824.     move.l    a0,4(sp)
  4825.     move.l    12(a6),(sp)
  4826.     bsr     _affir        
  4827.     move.l    a4,(sp)
  4828.     bsr     _divrr
  4829.     move.l    a3,4(sp)
  4830.     move.l    d0,(sp)
  4831.     bsr     _affrr
  4832.     addq.l    #8,sp
  4833.     move.l    a2,_avma
  4834.     bra.b     diviizf
  4835.  
  4836.  
  4837. *===================================================================*
  4838. *                                    *
  4839. *        Division : entier court / entier court = entier     *
  4840. *                                    *
  4841. *    entree : a7(4) contient s2 de type S            *
  4842. *         a7(8) contient s1 de type S            *
  4843. *    sortie : d0 pointe sur s2 div s1 de type I (zone creee)     *
  4844. *         d1.l contient le reste(du signe du dividende)    *
  4845. *                                    *
  4846. *===================================================================*
  4847.  
  4848. _divss:  link    a6,#0
  4849.     movem.l    d2-d3,-(sp)
  4850.     moveq    #0,d3
  4851.     move.l    12(a6),d1    
  4852.     bne.b     1f
  4853.     move.l    #23,-(sp)
  4854.     jsr     _err
  4855. 1:      move.l    8(a6),d2    
  4856.     bpl.b    5f
  4857.     moveq    #-1,d3
  4858. 5:    divs.l    d1,d3:d2
  4859.     bne.b     2f
  4860. 3:      move.l    _gzero,d0
  4861.     move.l    d3,d1
  4862.     bra.b     divssg
  4863. 2:      moveq    #3,d0
  4864.     bsr     _geti
  4865.     move.l    #0x1000003,4(a0)
  4866.     tst.l    d2
  4867.     bpl.b     4f
  4868.     neg.l    d2
  4869.     move.b    #-1,4(a0)
  4870. 4:      move.l    d2,8(a0)
  4871.     move.l    d3,d1
  4872. divssf:  move.l    a0,d0
  4873. divssg:    movem.l    (sp)+,d2-d3
  4874.     unlk    a6
  4875.     rts
  4876.  
  4877. *===================================================================*
  4878. *                                    *
  4879. *        Division : entier court / entier = entier        *
  4880. *                                    *
  4881. *    entree : a7(4) contient s2 de type S            *
  4882. *         a7(8) contient i1 de type I            *
  4883. *    sortie : d0 pointe sur s2 div i1 de type I (zone creee)     *
  4884. *         d1.l contient le reste (du signe du dividende)     *
  4885. *                                    *
  4886. *===================================================================*
  4887.  
  4888. _divsi:  link    a6,#0
  4889.     movem.l    d2-d4,-(sp)
  4890.     move.l    12(a6),a1    
  4891.     tst.b    4(a1)
  4892.     bne.b     1f
  4893.     move.l    #24,-(sp)
  4894.     jsr     _err
  4895. 1:      move.l    8(a6),d2    
  4896.     bne.b     3f
  4897. 2:      move.l    _gzero,d0
  4898.     moveq    #0,d1
  4899.     bra.b     divsig
  4900. 3:      move.w    6(a1),d1    
  4901.     cmp.w    #3,d1
  4902.     beq.b     4f
  4903. 6:      move.l    _gzero,d0
  4904.     move.l    d2,d1
  4905.     bra.b     divsig
  4906. 4:      move.l    8(a1),d1    
  4907.     move.l    d2,d3        
  4908.     bpl.b     5f
  4909.     neg.l    d3        
  4910. 5:      moveq    #0,d4
  4911.     divu.l    d1,d4:d3
  4912.     beq.b     6b
  4913.     moveq    #3,d0
  4914.     bsr     _geti
  4915.     move.l    d3,8(a0)    
  4916.     move.l    4(a1),4(a0)
  4917.     tst.l    d2
  4918.     bpl.b     7f
  4919.     move.b    #-1,4(a0)    
  4920. 7:      move.l    d4,d1
  4921.     tst.b    4(a1)
  4922.     bpl.b     divsif
  4923.     neg.l    d1        
  4924. divsif:  move.l    a0,d0
  4925. divsig:    movem.l    (sp)+,d2-d4
  4926.     unlk    a6
  4927.     rts
  4928.  
  4929. *===================================================================*
  4930. *                                    *
  4931. *        Division : entier court / reel = reel        *
  4932. *                                    *
  4933. *    entree : a7(4) contient s2 de type S            *
  4934. *         a7(8) pointe sur r1 de type R             *
  4935. *    sortie : d0 pointe sur s2 / r1 de type R (zone creee)    *
  4936. *                                    *
  4937. *===================================================================*
  4938.  
  4939. _divsr:  link    a6,#-32
  4940.     movem.l    d2/a2-a4,-(sp)
  4941.     move.l    12(a6),a1    
  4942.     tst.b    4(a1)
  4943.     bne.b     2f
  4944.     move.l    #25,-(sp)
  4945.     jsr     _err
  4946. 2:      tst.l    8(a6)
  4947.     bne.b     1f
  4948.     move.l    _gzero,d0
  4949.     bra.b     divsrf
  4950. 1:      moveq    #0,d0
  4951.     move.w    2(a1),d0
  4952.     bsr     _getr        
  4953.     move.l    8(a6),d2    
  4954.     move.l    a0,a4
  4955.     addq.w    #1,d0
  4956.     bsr     _getr
  4957.     move.l    a0,-(sp)     
  4958.     move.l    d2,-(sp)
  4959.     bsr     _affsr
  4960.     addq.l    #4,sp
  4961.     move.l    a0,a2        
  4962.     move.l    a4,a0        
  4963.     bsr     dvrr
  4964.     move.l    (sp)+,a0
  4965.     bsr     _giv         
  4966.     move.l    a4,d0
  4967. divsrf:  movem.l    (sp)+,d2/a2-a4    
  4968.     unlk    a6
  4969.     rts
  4970.  
  4971. *===================================================================*
  4972. *                                    *
  4973. *        Division : entier / entier court = entier        *
  4974. *                                    *
  4975. *    entree : a7(4) pointe sur i2 de type I             *
  4976. *         a7(8) contient s1 de type S            *
  4977. *    sortie : d0 pointe sur i2 / s1 de type I (zone creee)    *
  4978. *        le reste est dans d1.l (du signe du dividende)    *
  4979. *                                    *
  4980. *===================================================================*
  4981.  
  4982. _divis:  link    a6,#0
  4983.     movem.l    d2-d6/a2,-(sp)
  4984.     move.l    12(a6),d1    
  4985.     bne.b     1f
  4986.     move.l    #26,-(sp)
  4987.     jsr     _err
  4988. 1:      bpl.b     2f
  4989.     neg.l    d1
  4990. 2:      move.l    8(a6),a2    
  4991.     move.w    6(a2),d2    
  4992.     move.w    4(a2),d5    
  4993.     bne.b     4f
  4994. 3:      move.l    _gzero,d0
  4995.     moveq    #0,d1        
  4996.     bra.b     divisg
  4997. 4:      move.w    d2,d0        
  4998.     addq.l    #8,a2
  4999.     move.l    (a2)+,d4
  5000.     moveq    #0,d3
  5001.     divu.l    d1,d3:d4    
  5002.     bne.b     5f
  5003.     subq.w    #1,d0        
  5004.     cmp.w    #2,d0
  5005.     bne.b     5f
  5006.     move.l    _gzero,a0
  5007.     bra.b     L1008
  5008. 5:      bsr     _geti
  5009.     move.l    a0,a1
  5010.     move.w    d0,6(a0)    
  5011.     move.b    #1,4(a0)
  5012.     move.w    12(a6),d6    
  5013.     eor.w    d5,d6
  5014.     bpl.b     6f
  5015.     move.b    #-1,4(a0)    
  5016. 6:      addq.l    #8,a1
  5017.     tst.l    d4        
  5018.     beq.b     7f
  5019.     move.l    d4,(a1)+     
  5020. 7:      subq.w    #3,d2        
  5021.     bra.b     9f
  5022. 8:      move.l    (a2)+,d4     
  5023.     divu.l    d1,d3:d4
  5024.     move.l    d4,(a1)+
  5025. 9:      dbra    d2,8b
  5026. L1008:     move.l    d3,d1        
  5027.     tst.w    d5        
  5028.     bpl.b     divisf
  5029.     neg.l    d1        
  5030. divisf:  move.l    a0,d0        
  5031. divisg:    movem.l    (sp)+,d2-d6/a2
  5032.     unlk a6
  5033.     rts
  5034.  
  5035. *===================================================================*
  5036. *                                    *
  5037. *        Division : entier / entier = entier         *
  5038. *                                    *
  5039. *    entree : a7(4) pointe sur i2 de type I             *
  5040. *         a7(8) pointe sur i1 de type I             *
  5041. *    sortie : d0 pointe sur i2 / i1 de type I (zone creee)    *
  5042. *         Le reste est du signe du dividende         *
  5043. *                                    *
  5044. *===================================================================*
  5045.  
  5046. _divii:  clr.l    -(sp)
  5047.     move.l    12(sp),-(sp)    
  5048.     move.l    12(sp),-(sp)    
  5049.     bsr     _dvmdii
  5050.     lea     12(sp),sp    
  5051.     rts
  5052.  
  5053. *===================================================================*
  5054. *                                    *
  5055. *        Division : entier / reel = reel             *
  5056. *                                    *
  5057. *    entree : a7(4) pointe sur i2 de type I             *
  5058. *         a7(8) pointe sur r1 de type R             *
  5059. *    sortie : d0 pointe sur i2 / r1 de type R (zone creee)    *
  5060. *                                    *
  5061. *===================================================================*
  5062.  
  5063. _divir:  link    a6,#-32     
  5064.     movem.l    a2-a3,-(sp)
  5065.     move.l    12(a6),a1    
  5066.     tst.b    4(a1)
  5067.     bne.b     1f
  5068.     move.l    #27,-(sp)
  5069.     jsr     _err
  5070. 1:      move.l    8(a6),a2    
  5071.     tst.b    4(a2)
  5072.     bne.b     2f
  5073.     move.l    _gzero,d0
  5074.     bra.b     divirf
  5075. 2:      moveq    #0,d0        
  5076.     move.w    2(a1),d0    
  5077.     bsr     _getr        
  5078.     move.l    a0,a3
  5079.     addq.w    #1,d0
  5080.     bsr     _getr        
  5081.     move.l    a0,-16(a6)     
  5082.     move.l    a0,-(sp)
  5083.     move.l    a2,-(sp)
  5084.     bsr     _affir
  5085.     addq.l    #8,sp
  5086.     move.l    a0,a2        
  5087.     move.l    a3,a0        
  5088.     bsr     dvrr
  5089.     move.l    -16(a6),a0
  5090.     bsr     _giv         
  5091.     move.l    a3,d0
  5092. divirf:  movem.l    (sp)+,a2-a3
  5093.     unlk    a6
  5094.     rts
  5095.  
  5096. *===================================================================*
  5097. *                                    *
  5098. *        Division : reel / entier court = reel        *
  5099. *                                    *
  5100. *    entree : a7(4) pointe sur r2 de type R             *
  5101. *         a7(8) pointe sur s1 de type S             *
  5102. *    sortie : d0 pointe sur r2 / s1 de type R (zone creee)    *
  5103. *                                    *
  5104. *===================================================================*
  5105.  
  5106. _divrs:  link    a6,#0
  5107.     movem.l    d2-d6/a2,-(sp)
  5108.     move.l    12(a6),d1    
  5109.     bne.b     1f
  5110.     move.l    #28,-(sp)
  5111.     jsr     _err
  5112. 1:      move.l    8(a6),a2    
  5113.     tst.b    4(a2)
  5114.     bne.b     2f
  5115.     moveq    #3,d0
  5116.     bsr     _getr
  5117.     tst.l    d1
  5118.     bpl.b     L1109
  5119.     neg.l    d1
  5120. L1109:     bfffo    d1{0:32},d0
  5121.     add.l    4(a2),d0
  5122.     sub.l    #31,d0
  5123.     bmi.w     9f
  5124.     move.l    d0,4(a0)
  5125.     clr.l    8(a0)
  5126.     bra.w     divrsf
  5127. 2:      move.w    2(a2),d0    
  5128.     bsr     _getr        
  5129.     move.b    4(a2),4(a0)    
  5130.     tst.l    d1
  5131.     bpl.b     3f
  5132.     neg.l    d1        
  5133.     neg.b    4(a0)
  5134. 3:      move.l    a0,a1
  5135.     addq.l    #8,a1
  5136.     addq.l    #8,a2
  5137.     subq.w    #3,d0        
  5138.     move.l    d0,d2        
  5139.     moveq    #0,d3        
  5140. 4:      move.l    (a2)+,d4
  5141.     divu.l    d1,d3:d4
  5142.     move.l    d4,(a1)+
  5143.     dbra    d0,4b
  5144.     move.l    8(a0),d0    
  5145.     bpl.b     L1009
  5146.     moveq    #0,d1        
  5147.     bra.b     5f
  5148.     
  5149. L1009:     moveq    #0,d4
  5150.     divu.l    d1,d3:d4    
  5151.     bfffo    d0{0:32},d1    
  5152.     lsl.l    d1,d0        
  5153.     move.l    a0,a1
  5154.     addq.l    #8,a1
  5155.     moveq    #1,d6
  5156.     lsl.l    d1,d6
  5157.     subq.l    #1,d6        
  5158.     bra.b     7f
  5159. 6:      move.l    4(a1),d3
  5160.     rol.l    d1,d3
  5161.     move.l    d3,d5
  5162.     and.l    d6,d3
  5163.     add.l    d3,d0
  5164.     move.l    d0,(a1)+
  5165.     sub.l    d3,d5
  5166.     move.l    d5,d0
  5167. 7:      dbra    d2,6b
  5168.     rol.l    d1,d4        
  5169.     and.l    d6,d4
  5170.     add.l    d4,d0
  5171.     move.l    d0,(a1)
  5172. 5:      move.l    8(a6),a2    
  5173.     move.l    4(a2),d2
  5174.     and.l    #0xffffff,d2    
  5175.     sub.l    d1,d2        
  5176.     bpl.b     8f
  5177. 9:      move.l    #29,-(sp)
  5178.     jsr     _err
  5179. 8:      move.w    d2,6(a0)
  5180.     swap    d2
  5181.     move.b    d2,5(a0)    
  5182. divrsf:  move.l    a0,d0
  5183.     movem.l    (sp)+,d2-d6/a2
  5184.     unlk    a6
  5185.     rts
  5186.  
  5187.  
  5188. *===================================================================*
  5189. *                                    *
  5190. *        Division : reel / entier = reel             *
  5191. *                                    *
  5192. *    entree : a7(4) pointe sur r2 de type R             *
  5193. *         a7(8) pointe sur i1 de type I             *
  5194. *    sortie : d0 pointe sur r2 / i1 de type R (zone creee)    *
  5195. *                                    *
  5196. *===================================================================*
  5197.  
  5198. _divri:  link    a6,#-32     
  5199.     movem.l    d2-d3/a2-a3,-(sp)
  5200.     move.l    12(a6),a1    
  5201.     tst.b    4(a1)
  5202.     bne.b     1f
  5203.     move.l    #30,-(sp)
  5204.     jsr     _err
  5205. 1:      move.l    8(a6),a2    
  5206.     tst.b    4(a2)
  5207.     bne.b     2f
  5208.     moveq    #3,d0
  5209.     bsr     _getr
  5210.     move.w    6(a1),d0
  5211.     lsl.l    #5,d0
  5212.     bfffo    8(a1){0:32},d1
  5213.     add.l    4(a2),d1
  5214.     add.l    #65,d1
  5215.     sub.l    d0,d1
  5216.     bpl.b     3f
  5217.     move.l    #34,-(sp)    
  5218.     jsr     _err
  5219. 3:      move.l    d1,4(a0)    
  5220.     clr.l    8(a0)
  5221.     move.l    a0,d0
  5222.     bra.b     divrif
  5223. 2:      moveq    #0,d0
  5224.     move.w    2(a2),d0
  5225.     bsr     _getr        
  5226.     move.l    _avma,a3
  5227.     subq.l    #8,a3
  5228.     move.l    a3,_avma
  5229.     move.l    #2,(a3)
  5230.     move.l    a0,a3        
  5231.     addq.w    #1,d0
  5232.     bsr     _getr        
  5233.     move.l    a0,-16(a6)     
  5234.     move.l    a0,-(sp)
  5235.     move.l    a1,-(sp)
  5236.     bsr     _affir
  5237.     addq.l    #8,sp
  5238.     move.l    a0,a1        
  5239.     move.l    a3,a0        
  5240.     bsr     dvrr
  5241.     move.l    -16(a6),a0
  5242.     bsr     _giv         
  5243.     move.l    a3,d0
  5244. divrif:  movem.l    (sp)+,d2-d3/a2-a3
  5245.     unlk    a6
  5246.     rts
  5247.  
  5248. *===================================================================*
  5249. *                                    *
  5250. *        Division : reel / reel = reel            *
  5251. *                                    *
  5252. *    entree : a7(4) pointe sur r2 de type R             *
  5253. *         a7(8) pointe sur r1 de type R             *
  5254. *    sortie : d0 pointe sur r2 / r1 de type R (zone creee)    *
  5255. *    precision : L = inf ( L1 , L2 )                 *
  5256. *                                    *
  5257. *===================================================================*
  5258.  
  5259. _divrr:  link    a6,#-32     
  5260.     move.l    a2,-(sp)
  5261.     move.l    12(a6),a1    
  5262.     move.l    8(a6),a2    
  5263.     tst.b    4(a1)        
  5264.     bne.b     1f
  5265.     move.l    #31,-(sp)
  5266.     jsr     _err
  5267. 1:      tst.b    4(a2)        
  5268.     bne.b     3f
  5269.     moveq    #3,d0
  5270.     bsr     _getr
  5271.     move.l    4(a1),d0    
  5272.     and.l    #0xffffff,d0    
  5273.     sub.l    4(a2),d0
  5274.     neg.l    d0
  5275.     add.l    #0x800000,d0
  5276.     cmp.l    #0x1000000,d0
  5277.     bcs.b     4f
  5278.     move.l    #33,-(sp)    
  5279.     jsr     _err
  5280. 4:      tst.l    d0
  5281.     bgt.b     5f
  5282.     move.l    #32,-(sp)    
  5283.     jsr     _err
  5284. 5:      move.l    d0,4(a0)
  5285.     clr.l    8(a0)
  5286.     bra.b     divrrf
  5287. 3:      move.w    2(a1),d0
  5288.     cmp.w    2(a2),d0
  5289.     bls.b     2f
  5290.     move.w    2(a2),d0    
  5291. 2:      bsr     _getr
  5292.     bsr     dvrr        
  5293. divrrf:  move.l    a0,d0
  5294.     move.l    (sp),a2
  5295.     unlk    a6
  5296.     rts
  5297.  
  5298. *===================================================================*
  5299. *                                    *
  5300. *    module interne de division r/r (pour R/R,R/I,I/R et S/R)    *
  5301. *    --------------------------------------------------------    *
  5302. *    entree : a1 et a2 pointent sur 2 reels r1 et r2         *
  5303. *    tous 2 non nuls.                        *
  5304. *    a0 pointe sur un type reel de longueur l=inf(l1,l2)     *
  5305. *    ce module a besoin de variable.bs locales reservees et    *
  5306. *    pointees par a6 dans le programme appelant.         *
  5307. *    sortie : le quotient r2/r1 est mis a l'addresse initiale a0 *
  5308. *    (qui n'est pas affectee)                                    *
  5309. *===================================================================*
  5310.  
  5311. dvrr:     movem.l    d2-d7/a2-a4,-(sp)
  5312.     move.b    4(a1),d1    
  5313.     move.b    4(a2),d2    
  5314.     eor.b    d2,d1
  5315.     addq.b    #1,d1
  5316.     move.b    d1,-2(a6)    
  5317.     move.l    4(a2),d2
  5318.     and.l    #0xffffff,d2
  5319.     move.l    4(a1),d1
  5320.     and.l    #0xffffff,d1
  5321.     sub.l    d1,d2        
  5322.     add.l    #0x800000,d2
  5323.     move.l    d2,-6(a6)    
  5324.  
  5325.     move.w    2(a0),d0    
  5326.     move.w    2(a1),d1
  5327.     cmp.w    #3,d1
  5328.     bne.b    5f
  5329.     move.l    8(a1),d1
  5330.     move.l    8(a2),d3
  5331.     clr.l    d2
  5332.     cmp.w    #3,2(a2)
  5333.     beq.b    7f
  5334.     move.l    12(a2),d2
  5335. 7:    cmp.l    d3,d1
  5336.     bls    6f
  5337.     divu.l    d1,d3:d2
  5338.     move.l    d2,8(a0)
  5339.     move.l    -6(a6),d0
  5340.     subq.l    #1,d0
  5341.     bra.w    comd2
  5342. 6:    lsr.l    #1,d3
  5343.     roxr.l    #1,d2
  5344.     divu.l    d1,d3:d2
  5345.     move.l    d2,8(a0)
  5346.     move.l    -6(a6),d0
  5347.     bra.w    comd2
  5348. 5:    sub.w    d0,d1        
  5349.     move.w    d1,-28(a6)     
  5350.     subq.w    #2,d0
  5351.     move.w    d0,d7        
  5352.     move.w    d7,-12(a6)     
  5353.  
  5354.     move.l    (a0),-10(a6)    
  5355.     move.w    2(a2),d6
  5356.     subq.w    #2,d6
  5357.     addq.l    #8,a2        
  5358.     move.l    a0,a4
  5359.     clr.l    (a4)+
  5360. 1:      move.l    (a2)+,(a4)+    
  5361.     dbra    d0,1b
  5362.     cmp.w    d7,d6
  5363.     bgt.b    4f
  5364.     clr.l    -4(a4)
  5365. 4:    move.l    a0,a2        
  5366.     addq.l    #8,a1        
  5367.     lea     (8,a1,d7.w*4),a3 
  5368.     move.l    a3,-32(a6)
  5369.     move.w    -28(a6),d6     
  5370.     bne.b     2f        
  5371.     move.l    -8(a3),-20(a6)
  5372.     clr.l    -8(a3)
  5373. 2:      subq.w    #1,d6
  5374.     bgt.b     3f
  5375.     move.l    -4(a3),-24(a6)
  5376.     clr.l    -4(a3)
  5377. 3:      moveq    #0,d6        
  5378.  
  5379. *...................................................................*
  5380.  
  5381. dext:     move.l    (a1),d0        
  5382.     cmp.l    (a2),d0        
  5383.     bne.b     1f
  5384.     move.l    #-1,d1        
  5385.     add.l    4(a2),d0
  5386.     bcs.b     4f
  5387.     move.l    d0,d2
  5388.     bra.b     2f
  5389. 1:      move.l    (a2),d2        
  5390.     move.l    4(a2),d1    
  5391.     divu.l    d0,d2:d1    
  5392. 2:      move.l    4(a1),d3    
  5393.     mulu.l    d1,d4:d3    
  5394.     sub.l    8(a2),d3
  5395.     subx.l    d2,d4        
  5396.     bls.b     4f
  5397. 3:      subq.l    #1,d1        
  5398.     sub.l    4(a1),d3
  5399.     subx.l    d0,d4        
  5400.     bhi.b     3b        
  5401. 4:      move.w    d7,d0        
  5402.     move.l    a3,a1        
  5403.     move.l    a4,a2        
  5404.     move.l    -(a1),d2
  5405.     mulu.l    d1,d3:d2    
  5406.     sub.l    d2,d2
  5407. 5:      move.l    -(a1),d5
  5408.     mulu.l    d1,d4:d5    
  5409.     addx.l    d3,d5        
  5410.     addx.l    d2,d4        
  5411.     sub.l    d5,-(a2)     
  5412.     move.l    d4,d3
  5413.     dbra    d0,5b
  5414.     addx.l    d2,d3
  5415.     sub.l    d3,-4(a2)
  5416.     bcc.b     6f
  5417.     subq.l    #1,d1
  5418.     move.w    d7,d0
  5419.     move.l    a3,a1
  5420.     move.l    a4,a2
  5421.     subq.l    #4,a1        
  5422. 7:      addx.l    -(a1),-(a2)
  5423.     dbra    d0,7b
  5424. 6:      move.l    d1,-4(a2)    
  5425.     subq.l    #4,a3        
  5426. bcdf:     dbra    d7,dext     
  5427. *...................................................................*
  5428.     move.l    -32(a6),a3
  5429.     move.w    -28(a6),d5     
  5430.     bne.b     7f
  5431.     move.l    -20(a6),-8(a3)
  5432. 7:      subq.w    #1,d5
  5433.     bgt.b     8f
  5434.     move.l    -24(a6),-4(a3)
  5435. 8:      move.w    -12(a6),d5
  5436.     move.w    d5,d4        
  5437. 6:      move.l    -(a2),4(a2)
  5438.     dbra    d5,6b
  5439.     move.l    -10(a6),(a2)+    
  5440.     move.l    -6(a6),d0    
  5441.     move.l    (a2),d1        
  5442.     bne.b     1f
  5443.     subq.l    #1,d0        
  5444.     bra.b     comd2
  5445. 1:      addq.l    #4,a2        
  5446.     subq.w    #1,d4        
  5447.     asr.w    #1,d1        
  5448. 5:      roxr.w    (a2)+
  5449.     roxr.w    (a2)+
  5450.     dbra    d4,5b
  5451. comd2:     cmp.l    #0x1000000,d0
  5452.     ble.b     3f
  5453.     move.l    #32,-(sp)    
  5454.     jsr     _err
  5455. 3:      bcs.b     4f
  5456.     move.l    #33,-(sp)    
  5457.     jsr     _err
  5458. 4:      move.l    d0,4(a0)    
  5459.     move.b    -2(a6),4(a0)    
  5460.     movem.l    (sp)+,d2-d7/a2-a4
  5461. dvrrf:     rts
  5462.  
  5463.  
  5464.  
  5465.  
  5466. *********************************************************************
  5467. *********************************************************************
  5468. ***                                   ***
  5469. ***             PROGRAMMES D ' INVERSION                  ***
  5470. ***         ( programmes par valeurs : le resultat est      ***
  5471. **            mis dans un REEL existant deja    )      ***
  5472. ***                                   ***
  5473. *********************************************************************
  5474. *********************************************************************
  5475.  
  5476.  
  5477. _mpinvsr: move.l    8(sp),-(sp)
  5478.     move.l    8(sp),-(sp)
  5479.     pea     1
  5480.     bsr     _divssr
  5481.     lea     12(sp),sp
  5482.     rts
  5483.  
  5484. _mpinvz: cmp.b    #1,([4,sp])
  5485.     bne.b     _mpinvrr
  5486.  
  5487. _mpinvir: move.l    8(sp),-(sp)
  5488.     move.l    8(sp),-(sp)
  5489.     pea     1
  5490.     bsr     _divsiz
  5491.     lea     12(sp),sp
  5492.     rts
  5493.  
  5494. _mpinvrr: move.l    8(sp),-(sp)
  5495.     move.l    8(sp),-(sp)
  5496.     pea     1
  5497.     bsr     _divsrz
  5498.     lea     12(sp),sp
  5499.     rts
  5500.  
  5501.  
  5502.  
  5503. *********************************************************************
  5504. *********************************************************************
  5505. ***                                   ***
  5506. ***             PROGRAMMES MODULO              ***
  5507. ***                                   ***
  5508. *********************************************************************
  5509. *********************************************************************
  5510.  
  5511.  
  5512.  
  5513.  
  5514.  
  5515.  
  5516. *===================================================================*
  5517. *                                    *
  5518. *            Modulo (par valeur)             *
  5519. *                                    *
  5520. *    entree : a7(4) pointe sur n2 de type I             *
  5521. *         a7(8) pointe sur n1 de type I             *
  5522. *         a7(12) pointe sur n3 de type I            *
  5523. *    sortie : la zone pointee par a7(12) contient le reste de    *
  5524. *         la division de n2 par n1                *
  5525. *         compris entre 0 et abs(n1)-1            *
  5526. *    interdit : type S et R                    *
  5527. *                                    *
  5528. *===================================================================*
  5529.  
  5530. _mpmodz: lea     _modii,a0
  5531.     bra.w     mpopi
  5532.  
  5533.     
  5534. _modssz: lea     _modss,a0
  5535.     bra.w     mpopi
  5536.  
  5537.     
  5538. _modsiz: lea     _modsi,a0
  5539.     bra.w     mpopi
  5540.  
  5541.     
  5542. _modisz: lea     _modis,a0
  5543.     bra.w     mpopi
  5544.  
  5545.     
  5546. _modiiz: lea     _modii,a0
  5547.     bra.w     mpopi
  5548.  
  5549. *===================================================================*
  5550. *                                    *
  5551. *        entier court Modulo entier court = entier        *
  5552. *                                    *
  5553. *    entree : a7(4) contient s2 de type S            *
  5554. *         a7(8) contient s1 de type S            *
  5555. *    sortie : d0 pointe sur s2 mod s1 de type I (zone creee)     *
  5556. *         compris entre 0 et abs(s1)-1            *
  5557. *                                    *
  5558. *===================================================================*
  5559.  
  5560. _modss:  link    a6,#0
  5561.     movem.l    d2-d3,-(sp)
  5562.     moveq    #0,d3
  5563.     move.l    12(a6),d1    
  5564.     bne.b     1f
  5565.     move.l    #38,-(sp)
  5566.     jsr     _err
  5567. 1:      move.l    8(a6),d2    
  5568.     bpl.b    8f
  5569.     moveq    #-1,d3
  5570. 8:    divs.l    d1,d3:d2
  5571.     tst.l    d3
  5572.     bne.b     2f
  5573. 3:      move.l    _gzero,d0
  5574.     bra.b     modssf
  5575. 2:      bmi.b     5f
  5576.     moveq    #3,d0
  5577.     bsr     _geti
  5578.     move.l    #0x1000003,4(a0)
  5579.     move.l    d3,8(a0)
  5580.     bra.b     7f
  5581. 5:      move.l    12(a6),-(sp)
  5582.     move.l    d3,-(sp)
  5583.     tst.l    d1
  5584.     bpl.b     6f
  5585.     bsr     _subss
  5586.     addq.l    #8,sp
  5587.     bra.b     modssf
  5588. 6:      bsr     _addss
  5589.     addq.l    #8,sp
  5590.     bra.b     modssf
  5591. 7:      move.l    a0,d0
  5592. modssf:  movem.l    (sp)+,d2-d3
  5593.     unlk    a6
  5594.     rts
  5595.  
  5596. *===================================================================*
  5597. *                                    *
  5598. *    entier court Modulo entier = entier         *
  5599. *                                    *
  5600. *    entree : a7(4) contient s2 de type S            *
  5601. *         a7(8) ppinte sur i1 de type I             *
  5602. *    sortie : d0 pointe sur s2 mod i1 de type I (zone creee)     *
  5603. *         compris entre 0 et abs(i1)-1            *
  5604. *                                    *
  5605. *===================================================================*
  5606.  
  5607. _modsi:  link    a6,#0
  5608.     movem.l    d2-d3,-(sp)
  5609.     move.l    12(a6),-(sp)
  5610.     move.l    8(a6),-(sp)
  5611.     bsr     _divsi
  5612.     addq.l    #8,sp
  5613.     move.l    d0,a0
  5614.     bsr     _giv         
  5615.     tst.l    d1        
  5616.     bne.b     1f
  5617.     move.l    _gzero,d0
  5618.     bra.b     modsif
  5619. 1:      bmi.b     3f
  5620.     move.l    d1,d3        
  5621.     moveq    #3,d0
  5622.     bsr     _geti
  5623.     move.l    #0x1000003,4(a0)
  5624.     move.l    d3,8(a0)
  5625.     bra.b     2f
  5626. 3:      move.l    12(a6),-(sp)
  5627.     move.l    d1,-(sp)
  5628.     move.l    12(a6),a1    
  5629.     tst.b    4(a1)
  5630.     bpl.b     5f
  5631.     bsr     _subsi
  5632.     bra.b     6f
  5633. 5:      bsr     _addsi
  5634. 6:      addq.l    #8,sp
  5635.     bra.b     modsif
  5636. 2:      move.l    a0,d0
  5637. modsif:  movem.l    (sp)+,d2-d3
  5638.     unlk    a6
  5639.     rts
  5640.  
  5641. *===================================================================*
  5642. *                                    *
  5643. *        entier Modulo entier court = entier         *
  5644. *                                    *
  5645. *    entree : a7(4) pointe sur i2 de type I             *
  5646. *         a7(8) contient s1 de type S            *
  5647. *    sortie : d0 pointe sur i2 mod s1 de type I (zone creee)     *
  5648. *         compris entre 0 et abs(s1)-1            *
  5649. *                                    *
  5650. *===================================================================*
  5651.  
  5652. _modis:  link    a6,#0
  5653.     movem.l    d2-d3,-(sp)
  5654.     move.l    12(a6),-(sp)
  5655.     move.l    8(a6),-(sp)
  5656.     bsr     _divis
  5657.     addq.l    #8,sp
  5658.     move.l    d0,a0
  5659.     bsr     _giv
  5660.     tst.l    d1
  5661.     bne.b     1f
  5662.     move.l    _gzero,d0
  5663.     bra.b     modisf
  5664. 1:      bmi.b     3f
  5665.     move.l    d1,d3
  5666.     moveq    #3,d0
  5667.     bsr     _geti
  5668.     move.l    #0x1000003,4(a0)
  5669.     move.l    d3,8(a0)
  5670.     bra.b     2f
  5671. 3:      move.l    12(a6),-(sp)
  5672.     move.l    d1,-(sp)
  5673.     move.l    12(a6),d1    
  5674.     bpl.b     5f
  5675.     bsr     _subss
  5676.     bra.b     6f
  5677. 5:      bsr     _addss
  5678. 6:      addq.l    #8,sp
  5679.     bra.b     modisf
  5680. 2:      move.l    a0,d0
  5681. modisf:  movem.l    (sp)+,d2-d3
  5682.     unlk    a6
  5683.     rts
  5684.  
  5685. *===================================================================*
  5686. *                                    *
  5687. *        entier Modulo entier = entier            *
  5688. *                                    *
  5689. *    entree : a7(4) pointe sur i2 de type I             *
  5690. *         a7(8) pointe sur i1 de type I             *
  5691. *    sortie : d0 pointe sur i2 mod i1 de type I            *
  5692. *         compris entre 0 et abs(i1)-1(zone creee)        *
  5693. *                                    *
  5694. *===================================================================*
  5695.  
  5696. _modii:  link    a6,#-4
  5697.     move.l    #-1,-(sp)
  5698.     move.l    12(a6),-(sp)    
  5699.     move.l    8(a6),-(sp)     
  5700.     move.l    _avma,-4(a6)    
  5701.     bsr     _dvmdii
  5702.     move.l    d0,a1        
  5703.     tst.b    4(a1)
  5704.     bpl.b     modiif
  5705.     move.l    a1,(sp)        
  5706.     tst.b    ([12,a6],4)     
  5707.     bpl.b     1f
  5708.     bsr     _subii
  5709.     bra.b     2f
  5710. 1:      bsr     _addii
  5711. 2:      move.l    (sp)+,a1
  5712.     move.l    _avma,a0
  5713.     move.w    2(a0),d0
  5714.     subq.w    #1,d0
  5715.     move.l    -4(a6),a0    
  5716. 3:      move.l    -(a1),-(a0)
  5717.     dbra    d0,3b
  5718.     move.l    a0,_avma
  5719.     move.l    a0,d0        
  5720. modiif:  unlk    a6
  5721.     rts
  5722.  
  5723.  
  5724.  
  5725.  
  5726.  
  5727. *********************************************************************
  5728. *********************************************************************
  5729. ***                                   ***
  5730. ***     PROGRAMMES DE RESTE DES DIVISIONS ENTIERES          ***
  5731. ***                                   ***
  5732. *********************************************************************
  5733. *********************************************************************
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739. *===================================================================*
  5740. *                                    *
  5741. *            Reste (par valeur)                *
  5742. *                                    *
  5743. *    entree : a7(4) pointe sur n2 de type I             *
  5744. *         a7(8) pointe sur n1 de type I             *
  5745. *         a7(12) pointe sur n3 de type I            *
  5746. *    sortie : la zone pointee par a7(12) contient le reste de    *
  5747. *         la division de n2 par n1 (du signe du dividende)    *
  5748. *    interdit : type S et R                    *
  5749. *                                    *
  5750. *===================================================================*
  5751.  
  5752. _mpresz: lea     _resii,a0
  5753.     bra.w     mpopi
  5754.  
  5755.     
  5756. _resssz: lea     _resss,a0
  5757.     bra.w     mpopi
  5758.  
  5759.     
  5760. _ressiz: lea     _ressi,a0
  5761.     bra.w     mpopi
  5762.  
  5763.     
  5764. _resisz: lea     _resis,a0
  5765.     bra.w     mpopi
  5766.  
  5767.     
  5768. _resiiz: lea     _resii,a0
  5769.     bra.w     mpopi
  5770.  
  5771. *===================================================================*
  5772. *                                    *
  5773. *        Reste : entier court / entier court = entier    *
  5774. *                                    *
  5775. *    entree : a7(4) contient s2 de type S            *
  5776. *         a7(8) contient s1 de type S            *
  5777. *    sortie : d0 pointe sur le reste de la division s2 / s1    *
  5778. *         de type I (zone creee)                 *
  5779. *         Le reste est du signe du dividende         *
  5780. *                                    *
  5781. *===================================================================*
  5782.  
  5783. _resss:  link    a6,#0
  5784.     movem.l    d2-d3,-(sp)
  5785.     moveq    #0,d3
  5786.     move.l    12(a6),d1    
  5787.     bne.b     1f
  5788.     move.l    #40,-(sp)
  5789.     jsr     _err
  5790. 1:      move.l    8(a6),d2    
  5791.     bpl.b    4f
  5792.     moveq    #-1,d3    
  5793. 4:    divs.l    d1,d3:d2
  5794.     tst.l    d3
  5795.     bne.b     2f
  5796.     move.l    _gzero,d0
  5797.     bra.b     resssg
  5798. 2:      moveq    #3,d0
  5799.     bsr     _geti
  5800.     move.l    #0x1000003,4(a0)
  5801.     tst.l    d3
  5802.     bpl.b     3f
  5803.     neg.l    d3
  5804.     move.b    #-1,4(a0)
  5805. 3:      move.l    d3,8(a0)
  5806. resssf:  move.l    a0,d0
  5807. resssg:    movem.l    (sp)+,d2-d3
  5808.     unlk    a6
  5809.     rts
  5810.  
  5811. *===================================================================*
  5812. *                                    *
  5813. *        Reste : entier court / entier = entier        *
  5814. *                                    *
  5815. *    entree : a7(4) contient s2 de type S            *
  5816. *         a7(8) pointe sur i1 de type I             *
  5817. *    sortie : d0 pointe sur le reste de la division s2 / i1    *
  5818. *         de type I (zone creee)                 *
  5819. *         Le reste est du signe du dividende         *
  5820. *                                    *
  5821. *===================================================================*
  5822.  
  5823. _ressi:  move.l    8(sp),-(sp)     
  5824.     move.l    8(sp),-(sp)     
  5825.     bsr     _divsi
  5826.     move.l    d0,a0        
  5827.     bsr     _giv
  5828.     tst.l    d1        
  5829.     bne.b     1f
  5830.     move.l    _gzero,d0
  5831.     bra.b     ressig
  5832. 1:      moveq    #3,d0
  5833.     bsr     _geti
  5834.     move.l    #0x1000003,4(a0)
  5835.     tst.l    d1
  5836.     bpl.b     2f
  5837.     neg.l    d1
  5838.     move.b    #-1,4(a0)
  5839. 2:      move.l    d1,8(a0)
  5840. ressif:  move.l    a0,d0
  5841. ressig:    addq.l    #8,sp
  5842.     rts
  5843.  
  5844. *===================================================================*
  5845. *                                    *
  5846. *        Reste : entier / entier court = entier        *
  5847. *                                    *
  5848. *    entree : a7(4) pointe sur i2 de type I             *
  5849. *         a7(8) contient s1 de type S            *
  5850. *    sortie : d0 pointe sur le reste de la division i2 / s1    *
  5851. *         (zone creee)                    *
  5852. *         Le reste est du signe du dividende         *
  5853. *                                    *
  5854. *===================================================================*
  5855.  
  5856. _resis:  move.l    8(sp),-(sp)     
  5857.     move.l    8(sp),-(sp)     
  5858.     bsr     _divis
  5859.     move.l    d0,a0
  5860.     bsr     _giv         
  5861.     tst.l    d1        
  5862.     bne.b     1f
  5863.     move.l    _gzero,d0
  5864.     bra.b     resisg
  5865. 1:      moveq    #3,d0
  5866.     bsr     _geti
  5867.     move.l    #0x1000003,4(a0)
  5868.     tst.l    d1
  5869.     bpl.b     2f
  5870.     neg.l    d1
  5871.     move.b    #-1,4(a0)
  5872. 2:      move.l    d1,8(a0)
  5873. resisf:  move.l    a0,d0
  5874. resisg:    addq.l    #8,sp
  5875.     rts
  5876.  
  5877. *===================================================================*
  5878. *                                    *
  5879. *        Reste : entier / entier = entier            *
  5880. *                                    *
  5881. *    entree : a7(4) pointe sur i2 de type I             *
  5882. *         a7(8) pointe sur i1 de type I             *
  5883. *    sortie : d0 pointe sur le reste de la division i2 / i1    *
  5884. *         de type I (zone creee)                 *
  5885. *         ( du signe du dividende)                *
  5886. *                                    *
  5887. *===================================================================*
  5888.  
  5889. _resii:  move.l    #-1,-(sp)
  5890.     move.l    12(sp),-(sp)
  5891.     move.l    12(sp),-(sp)
  5892.     bsr     _dvmdii
  5893.     lea     12(sp),sp
  5894.     rts
  5895.  
  5896. *===================================================================*
  5897. *                                    *
  5898. *            Operations par valeur            *
  5899. *                                    *
  5900. *    entree : a7(4) contient n2 de type S ou pointe sur n2    *
  5901. *         de type I ou R                     *
  5902. *         a7(8) contient n1 de type S ou pointe sur n1    *
  5903. *         de type I ou R                     *
  5904. *         a7(12) pointe sur n3 de type I ou R        *
  5905. *    sortie : la zone pointee par a7(12) contient n2 op n1    *
  5906. *    remarque : les erreurs de type sont detectees dans l'       *
  5907. *           affectation du resultat                *
  5908. *                                    *
  5909. *===================================================================*
  5910.  
  5911.         
  5912. mpariz:  move.b    ([12,sp]),d0
  5913.     add.b    ([8,sp]),d0
  5914.     add.b    ([4,sp]),d0
  5915.     cmp.b    #3,d0
  5916.     beq.b     mpopz
  5917.     move.l    #42,-(sp)
  5918.     jsr     _err    
  5919.  
  5920.     
  5921. mpopi:     cmp.b    #1,([12,sp])
  5922.     beq.b     mpopz
  5923.     move.l    #43,-(sp)
  5924.     jsr     _err
  5925.     
  5926. mpopz:     move.l    8(sp),-(sp)     
  5927.     move.l    8(sp),-(sp)     
  5928.     jsr     (a0)
  5929.     move.l    20(sp),4(sp)    
  5930.     move.l    d0,(sp)        
  5931.     jsr     _mpaff
  5932.     addq.l    #8,sp
  5933.     move.l    d0,a0
  5934.     bra.w     _giv
  5935.  
  5936.         
  5937. mpopii:  move.b    ([16,sp]),d0
  5938.     add.b    ([12,sp]),d0
  5939.     cmp.b    #2,d0
  5940.     beq.b     mpopz2
  5941.     move.l    #43,-(sp)
  5942.     jsr     _err
  5943.  
  5944.     
  5945. mpopz2:  link    a6,#-8
  5946.     move.l    _avma,-8(a6)
  5947.     pea     -4(a6)
  5948.     move.l    12(a6),-(sp)    
  5949.     move.l    8(a6),-(sp)     
  5950.     jsr     (a0)
  5951.     addq.l    #4,sp
  5952.     move.l    -4(a6),(sp)
  5953.     move.l    20(a6),4(sp)
  5954.     bsr     _mpaff        
  5955.     move.l    d0,(sp)
  5956.     move.l    16(a6),4(sp)
  5957.     bsr     _mpaff        
  5958.     addq.l    #8,sp
  5959.     move.l    -8(a6),_avma
  5960.     unlk    a6
  5961.     rts
  5962.  
  5963.  
  5964.  
  5965.  
  5966.  
  5967. *********************************************************************
  5968. *********************************************************************
  5969. ***                                   ***
  5970. ***     PROGRAMMES PAR VALEUR UTILISES POUR LA LECTURE-ECRITURE   ***
  5971. ***                                   ***
  5972. *********************************************************************
  5973. *********************************************************************
  5974.  
  5975.  
  5976.  
  5977.  
  5978.  
  5979. *===================================================================*
  5980. *                                    *
  5981. *    Multiplication par valeur : entier court * entier = entier    *
  5982. *                                    *
  5983. *    entree : a7(4) contient s2 de type S            *
  5984. *         a7(8) pointe sur i1 de type I             *
  5985. *         a7(12) pointe sur i3 de type I            *
  5986. *    sortie : i3 pointe sur s2 * i1                *
  5987. *                                    *
  5988. *===================================================================*
  5989.  
  5990. _mulsii: move.l    8(sp),-(sp)
  5991.     move.l    8(sp),-(sp)
  5992.     bsr     _mulsi
  5993.     move.l    20(sp),4(sp)
  5994.     move.l    d0,(sp)
  5995.     bsr     _affii
  5996.     move.l    (sp),a0
  5997.     addq.l    #8,sp
  5998.     bra.w     _giv
  5999.  
  6000. *===================================================================*
  6001. *                                    *
  6002. *    Addition par valeur : entier court + entier = entier    *
  6003. *                                    *
  6004. *    entree : a7(4) contient s2 de type S            *
  6005. *         a7(8) pointe sur i1 de type I             *
  6006. *         a7(12) pointe sur i3 de type I            *
  6007. *    sortie : i3 pointe sur s2 + i1                *
  6008. *                                    *
  6009. *===================================================================*
  6010.  
  6011. _addsii: move.l    8(sp),-(sp)
  6012.     move.l    8(sp),-(sp)
  6013.     bsr     _addsi
  6014.     move.l    20(sp),4(sp)
  6015.     move.l    d0,(sp)
  6016.     bsr     _affii
  6017.     move.l    (sp),a0
  6018.     addq.l    #8,sp
  6019.     bra.w     _giv
  6020.  
  6021. *===================================================================*
  6022. *                                    *
  6023. *            division I / S = I                *
  6024. *                                    *
  6025. *    entree: a7(4) pointe sur i2, a7(8) contient s1        *
  6026. *        a7(12) pointe sur un type I            *
  6027. *    sortie: a7(12) pointe sur i2 div s1            *
  6028. *        d1 contient i2 mod s1                *
  6029. *                                    *
  6030. *===================================================================*
  6031.  
  6032. _divisii: move.l    8(sp),-(sp)
  6033.     move.l    8(sp),-(sp)
  6034.     bsr     _divis
  6035.     move.l    20(sp),4(sp)
  6036.     move.l    d0,(sp)
  6037.     bsr     _affii
  6038.     move.l    (sp),a0
  6039.     addq.l    #8,sp
  6040.     bra.w     _giv
  6041.  
  6042.     
  6043. *===================================================================*
  6044. *                                    *
  6045. *    Conversion    type I --> base 10^9                *
  6046. *                                    *
  6047. *    entree : a7(4) pointe sur un type I            *
  6048. *    sortie : le resultat recoit I converti en base 10^9,    *
  6049. *         sans signe, avec un -1 artificiel au debut     *
  6050. *         d0 pointe apres la zone du resultat        *
  6051. *                                    *
  6052. *===================================================================*
  6053.  
  6054. _convi:  link    a6,#0
  6055.     movem.l    d2/a2-a3,-(sp)
  6056.     move.l    _avma,d2
  6057.     move.l    8(a6),-(sp)
  6058.     bsr     _absi
  6059.     move.l    d0,a3
  6060.     move.w    6(a3),d0
  6061.     subq.w    #2,d0
  6062.     mulu    #15,d0
  6063.     divu    #14,d0
  6064.     addq.w    #3,d0
  6065.     bsr     _geti
  6066.     move.l    a0,a2
  6067.     addq.l    #4,a2
  6068.     move.l    #-1,(a2)+
  6069.     move.l    a3,-(sp)
  6070.     move.l    #1000000000,-(sp)
  6071.     move.l    a3,-(sp)
  6072.     tst.b    4(a3)
  6073.     bne.b     1f
  6074.     clr.l    (a2)+        
  6075.     bra.b     2f    
  6076. 1:      bsr     _divisii
  6077.     move.l    d1,(a2)+
  6078.     tst.b    4(a3)
  6079.     bne.b     1b
  6080. 2:      lea     16(sp),sp
  6081.     move.l    a2,d0
  6082.     move.l    d2,_avma
  6083.     movem.l    (sp)+,d2/a2-a3
  6084.     unlk    a6
  6085. convif:  rts
  6086.  
  6087. *===================================================================*
  6088. *                                    *
  6089. *    Conversion partie fractionnaire --> base 10^9        *
  6090. *                                    *
  6091. *    entree : a7(4) pointe sur un type R de module < 1        *
  6092. *    sortie : le resultat en base 10^9 precede par nb de dec.    *
  6093. *         d0 pointe sur le resultat                *
  6094. *                                    *
  6095. *===================================================================*
  6096.  
  6097. _confrac: link    a6,#-12
  6098.     movem.l    d2-d7/a2-a3,-(sp)
  6099.     move.l    _avma,-8(a6)
  6100.     move.l    8(a6),a1
  6101.     clr.l    d0
  6102.     move.w    2(a1),d0
  6103.     move.l    4(a1),d1
  6104.     and.l    #0xffffff,d1
  6105.     sub.l    #0x800000,d1
  6106.     not.l    d1
  6107.     move.l    d1,d7        
  6108.     subq.l    #2,d0        
  6109.     lsl.l    #5,d0
  6110.     add.l    d1,d0
  6111.     move.l    d0,d2        
  6112.     add.l    #95,d0        
  6113.     lsr.l    #5,d0
  6114.     bsr     _geti        
  6115.     move.l    d0,-4(a6)
  6116.     lsr.l    #5,d7        
  6117.     move.l    a0,a2
  6118.     bra.b     1f
  6119. 2:      clr.l    (a0)+
  6120. 1:      dbra    d7,2b
  6121.     move.w    2(a1),d3
  6122.     subq.l    #3,d3        
  6123.     addq.l    #8,a1
  6124.     and.l    #31,d1        
  6125.     bne.b     3f
  6126. 4:      move.l    (a1)+,(a0)+
  6127.     dbra    d3,4b
  6128.     bra.b     5f
  6129. 3:      moveq    #-1,d6
  6130.     lsr.l    d1,d6        
  6131.     moveq    #0,d4
  6132. 6:      move.l    (a1)+,d0
  6133.     ror.l    d1,d0
  6134.     move.l    d0,d5
  6135.     and.l    d6,d5
  6136.     sub.l    d5,d0
  6137.     add.l    d4,d5
  6138.     move.l    d5,(a0)+
  6139.     move.l    d0,d4
  6140.     dbra    d3,6b
  6141.     move.l    d4,(a0)+
  6142. 5:      clr.l    (a0)
  6143.     mulu.l    #8651,d3:d2
  6144.     divu.l    #28738,d3:d2    
  6145.     move.l    d2,d0
  6146.     addq.l    #1,d0
  6147.     move.l    d0,d7        
  6148.     add.l    #17,d0        
  6149.     divu    #9,d0
  6150.     bsr     _geti        
  6151.     move.l    a0,-12(a6)     
  6152.     move.l    d7,(a0)+     
  6153.     subq.w    #2,d0        
  6154.     move.l    -4(a6),d1    
  6155.     lea     (a2,d1.w*4),a2 
  6156.     subq.l    #1,d1
  6157.     move.l    a2,a3        
  6158.     move.l    d1,d3
  6159.     move.l    #1000000000,d6
  6160.     clr.l    d7
  6161. boext:     clr.l    d2
  6162. 1:      move.l    -(a2),d5
  6163.     mulu.l    d6,d4:d5
  6164.     add.l    d2,d5
  6165.     addx.l    d7,d4
  6166.     move.l    d5,(a2)
  6167.     move.l    d4,d2
  6168.     dbra    d1,1b
  6169.     move.l    d2,(a0)+
  6170.     move.l    a3,a2        
  6171.     move.l    d3,d1
  6172.     dbra    d0,boext
  6173.     move.l    -12(a6),d0     
  6174.     movem.l    (sp)+,d2-d7/a2-a3
  6175.     move.l    -8(a6),_avma
  6176.     unlk    a6
  6177.     rts
  6178.  
  6179.  
  6180.  
  6181.